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

#include <vcl.h>
#pragma hdrstop

#include "U_Main_Ex_Integracao.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "CesnaActiveX_OCX"
#pragma resource "*.dfm"
TFrmMain *FrmMain;
//---------------------------------------------------------------------------
__fastcall TFrmMain::TFrmMain(TComponent* Owner)
	: TForm(Owner)
{

}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::FormCreate(TObject *Sender)
{
int major, minor, release, build;

//--- Inicialização de Objetos
MemDisp->Text  							= "";	// Limpa Display
RdoGroupModoOper->ItemIndex  			= 0;	// Inicializa modo de operação A
RdoGroupMsgAbastecimento->ItemIndex		= 1;    // Inicializa mensagem de abastecimento
ChBoxAutoriza->Checked 					= 1;

//--- Inicialização de Variáveis.
memset(FlagOpen,false,sizeof(FlagOpen));
memset(RespTotais,0x00,sizeof(RespTotais));
memset(RespCdTot,0x00,sizeof(RespCdTot));

//------------------verificar versão do arquivo----------------------
if(VersaoArquivo("Projeto_Ex_Integracao.exe", &major, &minor, &release, &build))
{
	//altera versão do programa no Titulo do FrmMain
//	FrmMain->Caption = AnsiString("Exemplo Integração em C++ - Versão " + AnsiString(major) + "." + AnsiString(minor) + "." + AnsiString(release));
	FrmMain->Caption = AnsiString("Exemplo em C++ - CesnaActiveX.dll - Versão " + AnsiString(major) + "." + AnsiString(minor) + "." + AnsiString(release));
	Display(AnsiString("Exemplo Integração em C++ - Versão " + AnsiString(major) + "." + AnsiString(minor) + "." + AnsiString(release) + " (build " + AnsiString(build) + ")"));
}
else
{
	FrmMain->Caption = "Exemplo Integração em C++";
	Display("Erro ao obter versão do arquivo GerenciadorFcm.exe");
}
//--------------fim verificar versao do arquivo----------------------

}
//---------------------------------------------------------------------------
bool TFrmMain::VersaoArquivo(AnsiString Arquivo, int *Major, int *Minor, int *Release, int *Build)
{// Função para obter versão do exe configurada nas propriedades do projeto
	DWORD tempHandle = 0;
	DWORD infoLen;

	VS_FIXEDFILEINFO* fileInfo;

	infoLen = GetFileVersionInfoSize(Arquivo.c_str(), &tempHandle);

	if (infoLen > 0)
	{
		char* pBuf = (char *) malloc(infoLen);

		unsigned int valueLen;

		GetFileVersionInfo(Arquivo.c_str(), 0, infoLen, pBuf);

		if (VerQueryValue(pBuf, "\\", (void **)&fileInfo, &valueLen))
		{
			*Major   = (int)((fileInfo->dwFileVersionMS >> 16) & 0xffff);
			*Minor   = (int)((fileInfo->dwFileVersionMS      ) & 0xffff);
			*Release = (int)((fileInfo->dwFileVersionLS >> 16) & 0xffff);
			*Build   = (int)((fileInfo->dwFileVersionLS      ) & 0xffff);
		}
		else
		{
			Major   = 0;
			Minor   = 0;
			Release = 0;
			Build   = 0;

			return 0;
		}

		//----------------------------------------------------------------------//
		//                                                                      //
		// Free buffer.                                                         //
		//                                                                      //
		//----------------------------------------------------------------------//

		free(pBuf);
		return 1;
	}
	return 0;
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::Display(AnsiString X)
{
	if(MemDisp->Lines->Count > 999)
		MemDisp->Text = "";

	if((MemDisp->Lines->Count+1) > 99)
		MemDisp->Lines->Add("0" + AnsiString(MemDisp->Lines->Count+1) + ": " + X);
	else
		if((MemDisp->Lines->Count+1) > 9)
			MemDisp->Lines->Add("00" + AnsiString(MemDisp->Lines->Count+1) + ": " + X);
		else
			MemDisp->Lines->Add("000" + AnsiString(MemDisp->Lines->Count+1) + ": " + X);
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::ObtemEncerrantes2Click(TObject *Sender)
{
	FrmTotais->Show();
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::BtnFcmOpen1Click(TObject *Sender)
{
Master 		= 1;			// Inicializa var para 1 concentrador.
Slave		= Master; 		// Mesmo valor de FcmMaster
Bomba		= 1;			// Indica o número de bombas indicado, exsitentes na pista
FormatoMsgAbast = RdoGroupMsgAbastecimento->ItemIndex+1;	// Obtem o formato da mensagem de abastecimento

	// Setar o Modo de Operação Utilizado pelo Posto
	switch(RdoGroupModoOper->ItemIndex)
	{
		case 0:
			ModoOperacao = 0x0A;
		break;

		case 1:
			ModoOperacao = 0x0B;
		break;

		case 2:
			ModoOperacao = 0x0C;
		break;
	}

	Display ("Device= " + AnsiString(Master));
	if(FlagOpen[0] == false)
	{
		FlagOpen[0] = true;// Sinaliza como iniciado, limpa no cmd close.

		if(Cesna->FcmOpen(Master) == 1)
		{
			if (Cesna->FcmSetNumSlaves(Slave) == 1)
			{
			   if(Cesna->FcmConfigConcentrador(Slave, Bomba, ModoOperacao, FormatoMsgAbast)==1)
					Display ("Open Ok") ;
				else
					Display("Erro FcmConfigConcentradorFcm");
			}
			else
				Display("Erro FcmSetNumSlaves");
		}
		else
			Display("Erro FcmOpen");
	}
	else
		Display("Erro - Este FcmOpen já foi executado");

}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::BtnFcmOpen2Click(TObject *Sender)
{
Master 		= 2;			// Inicializa var para 1 concentrador.
Slave		= Master; 		// Mesmo valor de FcmMaster
Bomba		= 1;			// Indica o número de bombas indicado, exsitentes na pista
FormatoMsgAbast = RdoGroupMsgAbastecimento->ItemIndex+1;	// Obtem o formato da mensagem de abastecimento

	// Setar o Modo de Operação Utilizado pelo Posto
	switch(RdoGroupModoOper->ItemIndex)
	{
		case 0:
			ModoOperacao = 0x0A;
		break;

		case 1:
			ModoOperacao = 0x0B;
		break;

		case 2:
			ModoOperacao = 0x0C;
		break;
	}

	Display ("Device= " + AnsiString(Master));
	if(FlagOpen[1] == false)
	{
		FlagOpen[1] = true;// Sinaliza como iniciado, limpa no cmd close.

		if (Cesna->FcmOpen(Master) == 1)
		{
			if (Cesna->FcmSetNumSlaves(Slave) == 1)
			{
				if(Cesna->FcmConfigConcentrador(Slave, Bomba, ModoOperacao, FormatoMsgAbast)==1)
					Display ("Open Ok") ;
				else
					Display ("Erro FcmConfigConcentradorFcm");
			}
			else
				Display ("Erro FcmSetNumSlaves");
		}
		else
			 Display ("Erro FcmOpen");
	}
	else
		Display("Erro - Este FcmOpen já foi executado");
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::BtnFcmOpen3Click(TObject *Sender)
{
Master 		= 3;			// Inicializa var para 1 concentrador.
Slave		= Master; 		// Mesmo valor de FcmMaster
Bomba		= 1;			// Indica o número de bombas indicado, exsitentes na pista
FormatoMsgAbast = RdoGroupMsgAbastecimento->ItemIndex+1;	// Obtem o formato da mensagem de abastecimento

	// Setar o Modo de Operação Utilizado pelo Posto
	switch(RdoGroupModoOper->ItemIndex)
	{
		case 0:
			ModoOperacao = 0x0A;
		break;

		case 1:
			ModoOperacao = 0x0B;
		break;

		case 2:
			ModoOperacao = 0x0C;
		break;
	}

	Display ("Device= " + AnsiString(Master));
	if(FlagOpen[2] == false)
	{
		FlagOpen[2] = true;// Sinaliza como iniciado, limpa no cmd close.

		if(Cesna->FcmOpen(Master) == 1)
		{
			if (Cesna->FcmSetNumSlaves(Slave) == 1)
			{
				if(Cesna->FcmConfigConcentrador(Slave, Bomba, ModoOperacao, FormatoMsgAbast)==1)
					Display ("Open Ok") ;
				else
					Display ("Erro FcmConfigConcentradorFcm");
			}
			else
				Display ("Erro FcmSetNumSlaves");
		}
		else
			Display ("Erro FcmOpen");
	}
	else
		Display("Erro - Este FcmOpen já foi executado");
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::BtnCloseClick(TObject *Sender)
{
	Display("Finalizando Comunicação");

	Cesna->FcmClose();
	memset(FlagOpen,false,sizeof(FlagOpen));// Limpa sinalizador

	Display("Close OK - Comunicação Finalizada");
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::BtnVersaoDllClick(TObject *Sender)
{
AnsiString AuxStr ="";

	AuxStr = IntToStr((int)Cesna->FcmVersaoFcmMaster());

	switch(AuxStr.Length())
	{
		case 1:
			Display ("Versao FcmMaster V 000" + AuxStr);
		break;

		case 2:
			Display ("Versao FcmMaster V 00" + AuxStr);
		break;

		case 3:
			Display ("Versao FcmMaster V 0" + AuxStr);
		break;

		case 4:
			Display ("Versao FcmMaster V " + AuxStr);
		break;

		default:
			Display ("Versao FcmMaster V " + AuxStr);
		break;
	}
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::BtnConfiguraClick(TObject *Sender)
{
Slave = StrToInt(CmbNumSl->Text);		// Obtem número do FcmSlave
Bomba = StrToInt(CmbNumBo->Text);		// Obtem número da(s) Bomba(s).
FormatoMsgAbast = RdoGroupMsgAbastecimento->ItemIndex+1;

	switch(RdoGroupModoOper->ItemIndex)
	{
		case 0:
			ModoOperacao = 0x0A;
		break;

		case 1:
			ModoOperacao = 0x0B;
		break;

		case 2:
			ModoOperacao = 0x0C;
		break;
	}

	// A Confirmação deste cmd vêm pelo retorno do método "OnMudancaDeEstado" em "FCM_SLAVE_CONFIG"
	if(Cesna->FcmConfigConcentrador(Slave, Bomba, ModoOperacao, FormatoMsgAbast) != 1)
		Display("ERRO - Função Configura Concentrador");
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::BtnVersaoSlaveClick(TObject *Sender)
{
Slave = StrToInt(CmbNumSl->Text);		// Obtem número do FcmSlave

	// A resposta a Este cmd vêm pelo retorno do método "OnVersaoFcmSlave"
	if(Cesna->FcmSolicitaVersaoSlave(Slave) != 1)
		Display("ERRO - Função Obtem Versão FcmSlave");
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::BtnAutorizaClick(TObject *Sender)
{
Slave = StrToInt(CmbSlave->Text);
Bomba = StrToInt(CmbBomba->Text);
Bico = StrToInt(CmbBico->Text);
	// A Confirmação deste cmd vêm pelo retorno do método "OnMudancaDeEstado" em "ESTADO_BOMBA_LIBERADA"
	if(Cesna->FcmAutorizaAbastecimento(Slave,Bomba,Bico) != 1)
		Display ("ERRO - Função Autoriza");
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::BtnUltVolClick(TObject *Sender)
{
Slave = StrToInt(CmbSlave->Text);
Bomba = StrToInt(CmbBomba->Text);
Bico = StrToInt(CmbBico->Text);

	//solicita a bomba o ultimo abastecimento
	// A Resposta deste cmd vêm pelo retorno do método "OnVolume"
	if(Cesna->FcmSolicitaUltimoVolume(Slave,Bomba,Bico) != 1)
		Display ("ERRO - Solicita Último Abastecimento");
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::BtnTotClick(TObject *Sender)
{
Slave 	= StrToInt(CmbSlave->Text);
Bomba 	= StrToInt(CmbBomba->Text);
Bico	= StrToInt(CmbBico->Text);

	//solicita a bomba o totalizador
	// A Resposta deste cmd vêm pelo retorno do método "OnTotalizador"
	if (Cesna->FcmSolicitaTotalizador(Slave,Bomba,Bico) < 0)
	Display ("ERRO - SolicitaTotalizador");

}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::BtnObtemPplClick(TObject *Sender)
{
Slave = StrToInt(CmbSlave->Text);
Bomba = StrToInt(CmbBomba->Text);
Bico = StrToInt(CmbBico->Text);

	// A Resposta deste cmd vêm pelo retorno do método "OnPrecoPorLitro"
	//solicita a bomba o preco por litro
	if(Cesna->FcmSolicitaPrecoPorLitro(Slave,Bomba,Bico) != 1)
		Display ("ERRO - SolicitaPrecoPorLitro");
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::BtnTrocaPplClick(TObject *Sender)
{
long preco;// = MEdtPpl->Text.ToInt();

Slave = StrToInt(CmbSlave->Text);
Bomba = StrToInt(CmbBomba->Text);
Bico = StrToInt(CmbBico->Text);

	preco = (int)(MEdtPpl->Text.ToDouble() * 1000);

	// A Confirmação deste cmd vêm pelo retorno do método "OnMudancaDeEstado" em "ESTADO_BOMBA_TROCOU_PRECO"
	if(Cesna->FcmTrocaPreco(Slave,Bomba,Bico,preco,3) != 1)
		Display ("ERRO - TrocaPreco " + AnsiString (preco));
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::BtnPrePagoClick(TObject *Sender)
{
long volume;
unsigned char cd = 3;

Slave = StrToInt(CmbSlave->Text);
Bomba = StrToInt(CmbBomba->Text);
Bico = StrToInt(CmbBico->Text);

	volume = (int)(MEdtPrePago->Text.ToDouble() * 1000);

	// A Confirmação deste cmd vêm pelo retorno do método "OnMudancaDeEstado" em "ESTADO_BOMBA_RESERVADA_PREPAGO"
	if(Cesna->FcmProgramaPrePago(Slave,Bomba,Bico,volume,cd) != 1)
	{
		Display("ERRO - Programa Abastecimento PréPago");
	}
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::BtnTravaClick(TObject *Sender)
{
Slave = StrToInt(CmbSlave->Text);
Bomba = StrToInt(CmbBomba->Text);
Bico = StrToInt(CmbBico->Text);

	// A Confirmação deste cmd vêm pelo retorno do método "OnMudancaDeEstado" em "ESTADO_BOMBA_BLOQUEADA"
	if(Cesna->FcmTravaBomba(Slave,Bomba) != 1)
		Display("ERRO - Trava Bomba");
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::BtnDestravaClick(TObject *Sender)
{
Slave = StrToInt(CmbSlave->Text);
Bomba = StrToInt(CmbBomba->Text);
Bico = StrToInt(CmbBico->Text);

	// A Confirmação deste cmd vêm pelo retorno do método "OnMudancaDeEstado" em "ESTADO_BOMBA_DESBLOQUEADA"
	if(Cesna->FcmDesTravaBomba(Slave,Bomba) != 1)
		Display("ERRO - Destrava Bomba");
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::BtnObtemStatusBoClick(TObject *Sender)
{
Slave = StrToInt(CmbSlave->Text);
Bomba = StrToInt(CmbBomba->Text);
// Atenção: Se o parâmetro Bomba for mandado como zero, o concentrador Fcm enviará
//status de todas as bombas configuradas pela função FcmConfiguraSlave.
//Obs.: Somente nesta função o parâmetro bo pode ser zero.
	if (ChbTodas->Checked == TRUE) {
		Bomba = 0;
	}

	// A Resposta deste cmd vêm pelo retorno do método "OnMudancaDeEstado" de acordo com o estado de cada bomba.
	if(Cesna->FcmObtemStatusBomba(Slave,Bomba) != 1)
		Display("Erro - FcmObtemStatusBomba");
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::BtnConfigTotClick(TObject *Sender)
{
// Atenção: Esta função é utilizada somente em Concentrador Fcm para Bomba Mec com versão do Firmware 4
// V X.4.X.X
long Totalizador;

//--- Obtem Endereços
Slave 	= StrToInt(CmbSlave->Text);
Bomba 	= StrToInt(CmbBomba->Text);
Bico 	= StrToInt(CmbBico->Text);

	Totalizador = (int)(MEdtTotMec->Text.ToDouble() * 100);// Obs.: Duas Casas decimais fixas

	// A aceitação deste cmd vêm pelo retorno do método "OnMudancaDeEstado" em "FCM_SLAVE_CONFIG".
	if(Cesna->FcmConfigTotalizador(Slave,Bomba,Bico,Totalizador) != 1)
		Display("ERRO - FcmConfigTotalizador");
}
//---------------------------------------------------------------------------
//----------------- Retornos dos Métodos CesnaActiveX -----------------------
//---------------------------------------------------------------------------
void __fastcall TFrmMain::CesnaFcmMudancaDeEstado(	TObject *Sender,
													unsigned_char Slave,
													unsigned_char Bomba,
													unsigned_char Bico,
													unsigned_char Estado)
{
AnsiString	asAuxLocal = "";

	switch(Estado)
	{
		case ESTADO_INDEFINIDO:
			asAuxLocal = ("BOMBA ESTADO INDEFINIDO");
		break;
		case BOMBA_PRONTA:
			asAuxLocal = ("BOMBA PRONTA");
		break;
		case BOMBA_NAO_RESPONDE:
			asAuxLocal = ("BOMBA NÃO RESPONDE");
		break;
		case BOMBA_PEDE_AUTORIZACAO:
			asAuxLocal = ("BOMBA PEDE AUTORIZAÇÃO");
		break;
		case BOMBA_LIBERADA_PARA_ABASTECER:
			asAuxLocal = ("BOMBA LIBERADA");
		break;
		case BOMBA_ABASTECENDO:
			asAuxLocal = ("BOMBA ABASTECENDO");
		break;
		case BOMBA_ABASTECEU:
			asAuxLocal = ("BOMBA ABASTECEU");
		break;
		case BOMBA_BLOQUEADA:
			asAuxLocal = ("BOMBA BLOQUEADA");
		break;
		case BOMBA_DESBLOQUEADA:
			asAuxLocal = ("BOMBA DESBLOQUEADA");
		break;
		case BOMBA_RESERVADA_PRE_PAGO:
			asAuxLocal = ("BOMBA RESERVADA PRE PAGO");
		break;
		case BOMBA_TROCOU_PRECO_POR_LITRO:
			asAuxLocal = ("BOMBA TROCOU PREÇO");
		break;
		case FALHA_DE_COMUNICACAO_COM_CONCENTRADOR:
			asAuxLocal = ("SLAVE NAO RESPONDE");
		break;
		case CONCENTRADOR_ACEITOU_CONFIGURACAO:
			asAuxLocal = ("SLAVE CONFIG");
		break;
		case CONCENTRADOR_INFORMOU_VERSAO:
			asAuxLocal = ("SLAVE VERSAO");
		break;

		default:
			asAuxLocal = ("INDEFINIDO: " + AnsiString(Estado));
		break;
	}
	Display(	"Sl: " 	+ AnsiString((int)Slave)	+
				" Bo: "	+ AnsiString((int)Bomba) 	+
				" Bi: "	+ AnsiString((int)Bico) 	+
				" - " 	+ asAuxLocal				);

	//--- Controle para autorização automática deste exemplo
	//Obs.: Só será utilizado quando Concentrador estiver configurado para modo de operação B ou C.
	if(asAuxLocal == "BOMBA PEDE AUTORIZAÇÃO")
	{
		if(ChBoxAutoriza->Checked)
		{
			if(Cesna->FcmAutorizaAbastecimento(Slave,Bomba,Bico) != (long)1)
                Display("Erro ao Executar Comando Autoriza Bomba");
		}
    }
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::CesnaFcmAbasteceu(		TObject *Sender,
													unsigned_char Slave,
													unsigned_char Bomba,
													unsigned_char Bico,
													long Volume,
													long TotalInicial,
													long TotalFinal,
													long PrecoPorLitro,
													unsigned_char VolumeCasaDecimal,
													unsigned_char TotalInicialCasaDecimal,
													unsigned_char TotalFinalCasaDecimal,
													unsigned_char PrecoPorLitroCasaDecimal,
													long Hora,
													long Data)
{
AnsiString 		asAuxLocal 			= "";
AnsiString		asValorLocal		= "";
AnsiString		asVolumeLocal		= "";
AnsiString		asPrecoLocal		= "";
AnsiString		asTotIniLocal		= "";
AnsiString		asTotFinLocal		= "";
AnsiString		asHoraLocal			= "";
AnsiString		asDataLocal			= "";
AnsiString		asTagFrentLocal		= "";
AnsiString		asTagClientLocal	= "";

char       		cHoraIn  [6];
char       		cHoraOut [6];
char       		cDataIn  [6];
char       		cDataOut [6];

unsigned char 	ucTagFrentLocal	[16];
unsigned char 	ucTagClientLocal[16];

int				iNumLocal;
int				iContLocal;
unsigned long	ulAuxLocal;

	//--- Obtém Valor
	ulAuxLocal 				= (unsigned long)(Volume * PrecoPorLitro);
	ulAuxLocal				/= 10000;
	asAuxLocal 				= FormatFloat("0.00",ulAuxLocal/100.00);
	asValorLocal			= asAuxLocal;

	//--- Obtém Volume -----------------------------------------------------
	switch(VolumeCasaDecimal)
	{
		case 0:
			asAuxLocal 	= FormatFloat("0.0",Volume/1.0);
		break;

		case 1:
			asAuxLocal 	= FormatFloat("0.0",Volume/10.0);
		break;

		case 2:
			asAuxLocal 	= FormatFloat("0.00",Volume/100.0);
		break;

		case 3:
			asAuxLocal 	= FormatFloat("0.000",Volume/1000.0);
		break;
	}
	asVolumeLocal		= asAuxLocal;

	//--- Obtém Preço ------------------------------------------------------
	switch(PrecoPorLitroCasaDecimal)
	{
		case 0:
			asAuxLocal 	= FormatFloat("0.0",PrecoPorLitro/1.0);
		break;

		case 1:
			asAuxLocal 	= FormatFloat("0.0",PrecoPorLitro/10.0);
		break;

		case 2:
			asAuxLocal 	= FormatFloat("0.00",PrecoPorLitro/100.0);
		break;

		case 3:
			asAuxLocal 	= FormatFloat("0.000",PrecoPorLitro/1000.0);
		break;
	}
	asPrecoLocal		= asAuxLocal;

	//--- Total inicial ----------------------------------------------------
	switch(TotalInicialCasaDecimal)
	{
		case 0:
			asAuxLocal 	= FormatFloat("0.0",TotalInicial/1.0);
		break;

		case 1:
			asAuxLocal 	= FormatFloat("0.0",TotalInicial/10.0);
		break;

		case 2:
			asAuxLocal 	= FormatFloat("0.00",TotalInicial/100.0);
		break;

		case 3:
			asAuxLocal 	= FormatFloat("0.000",TotalInicial/1000.0);
		break;
	}
	asTotIniLocal		= asAuxLocal;

	//--- Total Final ------------------------------------------------------
	switch(TotalFinalCasaDecimal)
	{
		case 0:
			asAuxLocal 	= FormatFloat("0.0",TotalFinal/1.0);
		break;

		case 1:
			asAuxLocal 	= FormatFloat("0.0",TotalFinal/10.0);
		break;

		case 2:
			asAuxLocal 	= FormatFloat("0.00",TotalFinal/100.0);
		break;

		case 3:
			asAuxLocal 	= FormatFloat("0.000",TotalFinal/1000.0);
		break;
	}
	asTotFinLocal			= asAuxLocal;


	//--- Obtém Hora -------------------------------------------------------
	itoa(Hora,cHoraIn,10);
	iNumLocal = StrLen(cHoraIn);

	for(iContLocal = 0;iContLocal < 6;iContLocal++)
	{
		cHoraOut[iContLocal] = cHoraIn[iContLocal];
	}

	switch (iNumLocal)
	{
		case 0:
			 asAuxLocal = ("00:00:00");
		break;
		case 1:
			asAuxLocal = ("00:00:0" + AnsiString(cHoraOut[0]));
		break;
		case 2:
			asAuxLocal = ("00:00:" + AnsiString(cHoraOut[0]) +  AnsiString(cHoraOut[1]));
		break;
		case 3:
			asAuxLocal = ("00:0" + AnsiString(cHoraOut[0]) +":" +  AnsiString(cHoraOut[1]) + AnsiString(cHoraOut[2]));
		break;
		case 4:
			asAuxLocal = ("00:" + AnsiString(cHoraOut[0]) +  AnsiString(cHoraOut[1]) +":" + AnsiString(cHoraOut[2])+ AnsiString(cHoraOut[3]));
		break;
		case 5:
			asAuxLocal = ("0" + AnsiString(cHoraOut[0]) + ":" + AnsiString(cHoraOut[1]) + AnsiString(cHoraOut[2]) + ":" + AnsiString(cHoraOut[3]) + AnsiString(cHoraOut[4]));
		break;
		case 6:
			asAuxLocal = (AnsiString(cHoraOut[0]) + AnsiString(cHoraOut[1]) + ":" + AnsiString(cHoraOut[2]) + AnsiString(cHoraOut[3]) + ":" + AnsiString(cHoraOut[4]) + AnsiString(cHoraOut[5]));
		break;
		default:
			asAuxLocal =("Erro Hora - ERRO_FORMATO");
		break;
	}
	asHoraLocal			= asAuxLocal;

	//--- Obtém Data -------------------------------------------------------
	itoa(Data,cDataIn,10);
	iNumLocal= StrLen(cDataIn);

	for(iContLocal = 0;iContLocal < 6;iContLocal++)
	{
		cDataOut[iContLocal] = cDataIn[iContLocal];
	}

	switch (iNumLocal)
	{
		case 5:
			asAuxLocal = ("0" + AnsiString(cDataOut[0]) + "/" + AnsiString(cDataOut[1]) + AnsiString(cDataOut[2]) + "/" + AnsiString(cDataOut[3]) + AnsiString(cDataOut[4]));
		break;
		case 6:
			asAuxLocal = (AnsiString(cDataOut[0]) + AnsiString(cDataOut[1]) + "/" + AnsiString(cDataOut[2]) + AnsiString(cDataOut[3]) + "/" + AnsiString(cDataOut[4]) + AnsiString(cDataOut[5]));
		break;
		default:
			asAuxLocal = ("Erro Data - ERRO_FORMATO");
		break;
	}
	asDataLocal			= asAuxLocal;

	//--- Mostra Display
	Display(	"Sl: " + AnsiString((int)Slave)			+
				" Bo: "	+ AnsiString((int)Bomba)		+
				" Bi: "	+ AnsiString((int)Bico)			+
				" - INFORMOU DADOS"						);

	Display(	"Totalizador Inicial: "			+ asTotIniLocal + " Litros"				);
	Display(	"Valor: R$ "					+ asValorLocal							);
	Display(	"Volume: " 						+ asVolumeLocal	+ " Litros"				);
	Display(	"Preço por Litro: R$ "			+ asPrecoLocal							);
	Display(	"Totalizador Final: "			+ asTotFinLocal + " Litros"				);
	Display(	"Hora: "						+ asHoraLocal							);
	Display(	"Data: "						+ asDataLocal							);

	return;
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::CesnaFcmVolume(			TObject *Sender,
													unsigned_char Slave,
													unsigned_char Bomba,
													unsigned_char Bico,
													long Volume,
													unsigned_char VolumeCasaDecimal)
{
AnsiString asAuxLocal = "";

	//--- Obtém Volume
	switch(VolumeCasaDecimal)
	{
		case 0:
			asAuxLocal 	= FormatFloat("0.0",Volume/1.0);
		break;

		case 1:
			asAuxLocal 	= FormatFloat("0.0",Volume/10.0);
		break;

		case 2:
			asAuxLocal 	= FormatFloat("0.00",Volume/100.0);
		break;

		case 3:
			asAuxLocal 	= FormatFloat("0.000",Volume/1000.0);
		break;
   }

   Display(	"Sl: " + AnsiString((int)Slave)		+
			" Bo: "	+ AnsiString((int)Bomba)		+
			" Bi: "	+ AnsiString((int)Bico)			+
			" - Último Volume: " + asAuxLocal	+
			" Litros"								);
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::CesnaFcmPrecoPorLitro(	TObject *Sender,
													unsigned_char Slave,
													unsigned_char Bomba,
													unsigned_char Bico,
													long PrecoPorLitro,
													unsigned_char PrecoPorLitroCasaDecimal)
{
AnsiString asAuxLocal = "";

	//--- Obtém Preço por Litro
	switch(PrecoPorLitroCasaDecimal)
	{
		case 0:
			asAuxLocal 	= FormatFloat("0.0",PrecoPorLitro/1.0);
		break;

		case 1:
			asAuxLocal 	= FormatFloat("0.0",PrecoPorLitro/10.0);
		break;

		case 2:
			asAuxLocal 	= FormatFloat("0.00",PrecoPorLitro/100.0);
		break;

		case 3:
			asAuxLocal 	= FormatFloat("0.000",PrecoPorLitro/1000.0);
		break;
   }

   Display(	"Sl: " + AnsiString((int)Slave)		+
			" Bo: "	+ AnsiString((int)Bomba)		+
			" Bi: "	+ AnsiString((int)Bico)			+
			" - Preço por Litro: R$ " + asAuxLocal	);
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::CesnaFcmTotalizador(		TObject *Sender,
													unsigned_char Slave,
													unsigned_char Bomba,
													unsigned_char Bico,
													long Totalizador,
													unsigned_char TotalizadorCasaDecimal)
{
AnsiString asAuxLocal = "";

	//--- Obtém Totalizador Volume
	switch(TotalizadorCasaDecimal)
	{
		case 0:
			asAuxLocal 	= FormatFloat("0.0",Totalizador/1.0);
		break;

		case 1:
			asAuxLocal 	= FormatFloat("0.0",Totalizador/10.0);
		break;

		case 2:
			asAuxLocal 	= FormatFloat("0.00",Totalizador/100.0);
		break;

		case 3:
			asAuxLocal 	= FormatFloat("0.000",Totalizador/1000.0);
		break;
   }

   Display(	"Sl: " + AnsiString((int)Slave)			+
			" Bo: "	+ AnsiString((int)Bomba)		+
			" Bi: "	+ AnsiString((int)Bico)			+
			" - Totalizador Volume: " + asAuxLocal	+
			" Litros"								);

	if(FrmTotais->SolicitacaoAtiva)
	{   // Esta flag é utilizada opcionalmente, se for utilizar como indicador na opção obtem totais.
		FrmTotais->FlagObtemTotal[Bomba] 	= false;					// Limpa Indicador de recepção de totalizador.
		RespTotais[Slave][Bomba][Bico] 		= Totalizador;				// Armazena Totalizador
		RespCdTot[Slave][Bomba][Bico]  		= TotalizadorCasaDecimal;	// Armazena cd Totalizador
	}

}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::CesnaFcmEventoSlave(		TObject *Sender,
													unsigned_char Slave,
													unsigned_char Bomba,
													unsigned_char Bico,
													long Evento)
{
   Display(	"Sl: " + AnsiString((int)Slave)			+
			" Bo: "	+ AnsiString((int)Bomba)		+
			" Bi: "	+ AnsiString((int)Bico)			+
			" - Informou Evento: " 					+
			AnsiString((int)Evento)			 		);
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::CesnaFcmErroDLL(TObject *Sender, unsigned_char Erro)
{
AnsiString asAuxLocal = "";
	switch(Erro)
	{
		case EVENTO_MASTER_ERRO_LRC:
			asAuxLocal = ("MASTER ERRO LRC");
		break;
		case EVENTO_MASTER_ERRO_PROTOCOLO:
			asAuxLocal = ("MASTER ERRO PRT");
		break;
		case EVENTO_MASTER_FINALIZOU:
			asAuxLocal = ("MASTER ERRO FINALIZOU");
		break;
	}
	Display("Erro On Dll: " + asAuxLocal + " - " + AnsiString((int)Erro));
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::CesnaFcmRetornoEspecial(	TObject *Sender,
													unsigned_char Slave,
													unsigned_char Bomba,
													unsigned_char Bico,
													long CodigoRetorno,
													long Retorno1,
													long Retorno2,
													long Retorno3)
{
   Display(	"Sl: " + AnsiString((int)Slave)			+
			" Bo: "	+ AnsiString((int)Bomba)		+
			" Bi: "	+ AnsiString((int)Bico)			+
			" - Retorno Especial"					);
   Display("COD: " 			+ AnsiString((int)CodigoRetorno));
   Display("Retorno 1: " 	+ AnsiString((int)Retorno1));
   Display("Retorno 2: " 	+ AnsiString((int)Retorno2));
   Display("Retorno 3: " 	+ AnsiString((int)Retorno3));
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::CesnaFcmVersaoFcmSlave(	TObject *Sender,
													unsigned_char Slave,
													long Versao)
{
   Display(	"Sl: " + AnsiString((int)Slave)			+
			" - Informou Versão: " 					+
			AnsiString((int)Versao)			 		);
}
//---------------------------------------------------------------------------


