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

#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->Lines->Clear();
ChBoxAutoriza->Checked 			= 1;
CmbNumMab->ItemIndex 			= 0;
CmbNumBo->ItemIndex				= 0;
CmbBoxModoOp->ItemIndex			= 0;
CmbBoxTipoBomba->ItemIndex		= 0;
CmbEndMab->ItemIndex			= 0;
CmbEndBomba->ItemIndex          = 0;
CmbEndBico->ItemIndex           = 0;

//--- 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----------------------
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::FormDestroy(TObject *Sender)
{
//--- Rotinas para Finalizar programa
	if(FlagComAtiva)
		BtnInitComClick(this);

	Cesna->FreeOnRelease();

	Close();
}
//---------------------------------------------------------------------------
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::BtnSairClick(TObject *Sender)
{
	Close();
}
//---------------------------------------------------------------------------
//*************** Comandos Master IdCode USB ********************************
//---------------------------------------------------------------------------
void __fastcall TFrmMain::BtnInitComClick(TObject *Sender)
{
AnsiString		StrStart 	= "Inicia COM";
AnsiString		StrStop 	= "Finaliza COM";

unsigned char	AuxLocal 	= (unsigned char)0x00;
long			Retorno		= (long)0;

	if(BtnInitCom->Caption == StrStart)
	{
		AuxLocal = (char)StrToInt(InputBox("Número de MAB'S para COM","Inserir Número de MAB'S","1"));

		if((AuxLocal < (unsigned char)1) || (AuxLocal > (unsigned char)32))
		{
			ShowMessage("Erro Núm MAB's COM\nDeve ser entre 1 e 32");
			return;
		}

		Retorno = Cesna->IdCodeOpen(AuxLocal);
		if(Retorno != (long)1)
		{
			Display("OPEN DEVICE ERRO!");
			return;
		}

		Retorno = Cesna->IdCodeObtemAbastecimento(true);						//--- Obtém Abastecimento
		if(Retorno != (long)1)
		{
			Display("Seta Flag Obtém Abastecimento ERRO!");
			return;
		}

		FlagComAtiva		= true;
		BtnInitCom->Caption = StrStop;
		Display("OPEN DEVICE OK!");
	}
	else
	{
		Retorno = Cesna->IdCodeClose();
		if(Retorno != (long)1)
		{
			Display("ERRO ao Executar Cmd Close - Retorno: " + AnsiString((int)Retorno));
			return;
		}

		BtnInitCom->Caption = StrStart;
		Display("CLOSE DEVICE OK!");
		FlagComAtiva		= false;
	}
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::BtnVersaoDllClick(TObject *Sender)
{
AnsiString AuxStr ="";

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

	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;
	}
}
//---------------------------------------------------------------------------
//*************** Comandos Concentrador IdCode ******************************
//---------------------------------------------------------------------------
void __fastcall TFrmMain::BtnObtemConfigClick(TObject *Sender)
{
unsigned char 	EndMabLocal		= (unsigned char)0x00;
long			RetornoLocal	= (long)0;

	EndMabLocal	= (unsigned char)(CmbNumMab->ItemIndex + 1);

	// A Resposta deste cmd vêm pelo retorno do método "CesnaIdCodeConfigMab"
	RetornoLocal = Cesna->IdCodeObtemConfiguracaoMab(EndMabLocal);

	if(RetornoLocal != (long)1)
	{
		Display("ERRO:\nCmd Obtém Configuração não executado!\nRetorno: " + AnsiString((int)RetornoLocal));
		return;
	}
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::BtnConfiguraClick(TObject *Sender)
{
unsigned char 	EndMabLocal		= (unsigned char)0x00;
unsigned char 	NumBoLocal		= (unsigned char)0x00;
unsigned char 	ModoOpLocal		= (unsigned char)0x00;
unsigned char 	TipoBoLocal		= (unsigned char)0x00;
long			RetornoLocal	= (long)0;

	//--- Atenção: Este comando foi colocado aqui para auxiliar o software
	//integrador no desenvolvimento, caso o mesmo necessite alterar o número de
	//bombas configurado em cada MAB. Porém em campo, ou seja, em um posto de combustível
	//este comando será enviado pelo Gerenciador Cesna IdCode no momento da
	//instalação do Concentrador IdCode.

	EndMabLocal = (unsigned char) (CmbNumMab->ItemIndex 		+ 1);
	NumBoLocal	= (unsigned char) (CmbNumBo->ItemIndex 			+ 1);
	ModoOpLocal	= (unsigned char) (CmbBoxModoOp->ItemIndex 		+ 0x0A);
	TipoBoLocal	= (unsigned char) (CmbBoxTipoBomba->ItemIndex 	+ 1);

	// A Confirmação deste cmd vêm pelo retorno do método "OnIdCodeMudancaDeEstado" em "CONCENTRADOR_ACEITOU_CONFIGURACAO"
	RetornoLocal = Cesna->IdCodeConfiguraMab(EndMabLocal,NumBoLocal,TipoBoLocal,ModoOpLocal);

	if(RetornoLocal != (long)1)
	{
		Display("ERRO:\nCmd Configura não executado!\nRetorno: " + AnsiString((int)RetornoLocal));
		return;
	}
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::BtnObtemNumAbastOffClick(TObject *Sender)
{
unsigned char 	EndMabLocal		= (unsigned char)0x00;
long			RetornoLocal	= (long)0;

	EndMabLocal = (unsigned char) (CmbNumMab->ItemIndex + 1);

	// A Resposta deste cmd vêm pelo retorno do método "CesnaIdCodeNumAbastOff"
	if((RetornoLocal = Cesna->IdCodeObtemNumAbastOff(EndMabLocal)) != (long)1)
	{
		Display("ERRO:\nCmd Obtém Núm. Abastecimentos OFF MAB não executado!\nRetorno: " + AnsiString((int)RetornoLocal));
		return;
	}
}
//------------------------------------------------------------------------------
//************** Comandos para Bomba *******************************************
//------------------------------------------------------------------------------
bool __fastcall TFrmMain::ObtemEnderecos(unsigned char *PtrEndMab,unsigned char *PtrEndBo,unsigned char *PtrEndBi)
{
// Esta função obtém endereços dos ComboBox utilizados no GroupBox "Comandos Bombas"

	//--- Filtro de Endereços
	if(	((CmbEndMab->ItemIndex 		+ 1) < (int)1)	||
		((CmbEndBomba->ItemIndex  	+ 1) < (int)1)	||
		((CmbEndBico->ItemIndex  	+ 1) < (int)1)	||
		((CmbEndMab->ItemIndex		+ 1) > (int)32)	||
		((CmbEndBomba->ItemIndex 	+ 1) > (int)4)	||
		((CmbEndBico->ItemIndex 	+ 1) > (int)4)	)
	{
		Display("ERRO:\nEndereços de MAB, Bomba e Bico devem estar Fora do Range!");
		return false;
	}
	else
	{
		*PtrEndMab 	= (unsigned char)(CmbEndMab->ItemIndex 		+ 1);
		*PtrEndBo 	= (unsigned char)(CmbEndBomba->ItemIndex 	+ 1);
		*PtrEndBi 	= (unsigned char)(CmbEndBico->ItemIndex 	+ 1);
		return true;
	}
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::BtnAutorizaClick(TObject *Sender)
{
unsigned char 	EndMabLocal		= (unsigned char)0x00;
unsigned char	EndBoLocal		= (unsigned char)0x00;
unsigned char	EndBiLocal		= (unsigned char)0x00;
long			RetornoLocal	= (long)0;

	if(ObtemEnderecos(&EndMabLocal,&EndBoLocal,&EndBiLocal) == false)
		return;

	// A Confirmação deste cmd vêm pelo retorno do método "OnMudancaDeEstado" em "ESTADO_BOMBA_LIBERADA"
	RetornoLocal = Cesna->IdCodeAutorizaAbastecimento(EndMabLocal,EndBoLocal,EndBiLocal);

	if(RetornoLocal != (long)1)
		Display ("ERRO - Cmd Autoriza!");
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::BtnUltVolClick(TObject *Sender)
{
unsigned char 	EndMabLocal		= (unsigned char)0x00;
unsigned char	EndBoLocal		= (unsigned char)0x00;
unsigned char	EndBiLocal		= (unsigned char)0x00;
long			RetornoLocal	= (long)0;

	if(ObtemEnderecos(&EndMabLocal,&EndBoLocal,&EndBiLocal) == false)
		return;

	// A Resposta deste cmd vêm pelo retorno do método "OnIdCodeVolume"
	RetornoLocal = Cesna->IdCodeObtemUltimoVolume(EndMabLocal,EndBoLocal,EndBiLocal);

	if(RetornoLocal != (long)1)
		Display ("ERRO - Cmd Solicita Último Volume!");
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::BtnObtemPplClick(TObject *Sender)
{
unsigned char 	EndMabLocal		= (unsigned char)0x00;
unsigned char	EndBoLocal		= (unsigned char)0x00;
unsigned char	EndBiLocal		= (unsigned char)0x00;
long			RetornoLocal	= (long)0;

	if(ObtemEnderecos(&EndMabLocal,&EndBoLocal,&EndBiLocal) == false)
		return;

	// Solicita a bomba o preco por litro
	// A Resposta deste cmd vêm pelo retorno do método "OnIdCodePrecoPorLitro"
	RetornoLocal = Cesna->IdCodeObtemPrecoPorLitro(EndMabLocal,EndBoLocal,EndBiLocal);

	if(RetornoLocal != (long)1)
		Display ("ERRO - Cmd Solicita Preco por Litro!");
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::BtnTotClick(TObject *Sender)
{
unsigned char 	EndMabLocal		= (unsigned char)0x00;
unsigned char	EndBoLocal		= (unsigned char)0x00;
unsigned char	EndBiLocal		= (unsigned char)0x00;
long			RetornoLocal	= (long)0;

	if(ObtemEnderecos(&EndMabLocal,&EndBoLocal,&EndBiLocal) == false)
		return;

	//solicita a bomba o totalizador
	// A Resposta deste cmd vêm pelo retorno do método "OnIdCodeTotalizador"
	RetornoLocal = Cesna->IdCodeObtemPrecoPorLitro(EndMabLocal,EndBoLocal,EndBiLocal);

	if(RetornoLocal != (long)1)
		Display ("ERRO - Cmd Solicita Totalizador!");
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::BtnTravaClick(TObject *Sender)
{
unsigned char 	EndMabLocal		= (unsigned char)0x00;
unsigned char	EndBoLocal		= (unsigned char)0x00;
unsigned char	EndBiLocal		= (unsigned char)0x00;
long			RetornoLocal	= (long)0;

	if(ObtemEnderecos(&EndMabLocal,&EndBoLocal,&EndBiLocal) == false)
		return;

	// A Confirmação deste cmd vêm pelo retorno do método "OnIdCodeMudancaDeEstado" em "ESTADO_BOMBA_BLOQUEADA"
	RetornoLocal = Cesna->IdCodeTravaBomba(EndMabLocal,EndBoLocal,EndBiLocal);

	if(RetornoLocal != (long)1)
		Display("ERRO - Cmd Trava Bomba!");
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::BtnDestravaClick(TObject *Sender)
{
unsigned char 	EndMabLocal		= (unsigned char)0x00;
unsigned char	EndBoLocal		= (unsigned char)0x00;
unsigned char	EndBiLocal		= (unsigned char)0x00;
long			RetornoLocal	= (long)0;

	if(ObtemEnderecos(&EndMabLocal,&EndBoLocal,&EndBiLocal) == false)
		return;

	// A Confirmação deste cmd vêm pelo retorno do método "OnIdCodeMudancaDeEstado" em "BOMBA_DESBLOQUEADA"
	RetornoLocal = Cesna->IdCodeDestravaBomba(EndMabLocal,EndBoLocal,EndBiLocal);

	if(RetornoLocal != (long)1)
		Display("ERRO - Destrava Bomba");
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::BtnObtemStatusBoClick(TObject *Sender)
{
unsigned char 	EndMabLocal		= (unsigned char)0x00;
unsigned char	EndBoLocal		= (unsigned char)0x00;
unsigned char	EndBiLocal		= (unsigned char)0x00;
long			RetornoLocal	= (long)0;

	if(ObtemEnderecos(&EndMabLocal,&EndBoLocal,&EndBiLocal) == false)
		return;

// Atenção: Se o parâmetro Bomba for mandado como zero, placa Mab IdCode enviará
//status de todas as bombas configuradas no momento.
//Obs.: Somente nesta função o parâmetro bo pode ser zero.
	if(ChbTodas->Checked == true)
	{
		EndBoLocal = 0;
	}

	// A Resposta deste cmd vêm pelo retorno do método "OnIdCodeMudancaDeEstado" de acordo com o estado de cada bomba.
	RetornoLocal = Cesna->IdCodeObtemStatusBomba(EndMabLocal,EndBoLocal);

	if(RetornoLocal != (long)1)
		Display("Erro - Cmd Obtem Status Bomba!");
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::BtnTrocaPplClick(TObject *Sender)
{
unsigned char 	EndMabLocal			= (unsigned char)0x00;
unsigned char	EndBoLocal			= (unsigned char)0x00;
unsigned char	EndBiLocal			= (unsigned char)0x00;
long			RetornoLocal		= (long)0;

long 			Preco				= (long)0;
unsigned char	CasaDecimalPreco	= (unsigned char)0x03;						// Valor fixo

	if(ObtemEnderecos(&EndMabLocal,&EndBoLocal,&EndBiLocal) == false)
		return;

	Preco = (long)(MEdtPpl->Text.ToDouble() * 1000);

	// A Confirmação deste cmd vêm pelo retorno do método "OnIdCodeMudancaDeEstado" em "BOMBA_TROCOU_PRECO"
	RetornoLocal = Cesna->IdCodeTrocaPrecoPorLitro(EndMabLocal,EndBoLocal,EndBiLocal,Preco,CasaDecimalPreco);

	if(RetornoLocal != (long)1)
		Display("ERRO - Cmd Troca Preco!");
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::BtnPrePagoClick(TObject *Sender)
{
unsigned char 	EndMabLocal			= (unsigned char)0x00;
unsigned char	EndBoLocal			= (unsigned char)0x00;
unsigned char	EndBiLocal			= (unsigned char)0x00;
long			RetornoLocal		= (long)0;

long 			Volume				= (long)0;
unsigned char	CasaDecimalVolume	= (unsigned char)0x03;						// Valor fixo

	if(ObtemEnderecos(&EndMabLocal,&EndBoLocal,&EndBiLocal) == false)
		return;

	Volume = (long)(MEdtPrePago->Text.ToDouble() * 1000);

	// A Confirmação deste cmd vêm pelo retorno do método "OnMudancaDeEstado" em "ESTADO_BOMBA_RESERVADA_PREPAGO"
	RetornoLocal = Cesna->IdCodeSetaPrePago(EndMabLocal,EndBoLocal,EndBiLocal,Volume,CasaDecimalVolume);

	if(RetornoLocal != (long)1)
		Display("ERRO - Cmd Programa Abastecimento PréPago!");

}
//---------------------------------------------------------------------------
//----------------- Retornos dos Métodos CesnaActiveX -----------------------
//---------------------------------------------------------------------------
void __fastcall TFrmMain::CesnaIdCodeMudancaDeEstado(			TObject *Sender,
																unsigned_char Mab,
																unsigned_char Bomba,
																unsigned_char Bico,
																unsigned_char Estado)
{
AnsiString	asAuxLocal = "";

	switch(Estado)
	{
		//--- Estado das Bombas
		case ESTADO_INDEFINIDO:
			asAuxLocal = ("BOMBA ESTADO INDEFINIDO");
		break;
		case BOMBA_PRONTA:
			asAuxLocal = ("BOMBA PRONTA");
		break;
		case BOMBA_PEDE_AUTORIZACAO:
			asAuxLocal = ("BOMBA PEDE AUTORIZAÇÃO");
		break;
		case BOMBA_AGUARDANDO_CARTAO:
			asAuxLocal = ("BOMBA AGUARDANDO CARTÃO");
		break;
		case BOMBA_LIBERADA_PARA_ABASTECER:
			asAuxLocal = ("BOMBA LIBERADA PARA ABASTECER");
		break;
		case BOMBA_ABASTECENDO:
			asAuxLocal = ("BOMBA ABASTECENDO");
		break;
		case BOMBA_ABASTECEU:
			asAuxLocal = ("BOMBA ABASTECEU");
		break;
		case BOMBA_TROCOU_PRECO_POR_LITRO:
			asAuxLocal = ("BOMBA TROCOU PREÇO POR LITRO");
		break;
		case BOMBA_RESERVADA_PRE_PAGO:
			asAuxLocal = ("BOMBA RESERVADO PRÉ-PAGO");
		break;
		case BOMBA_BLOQUEADA:
			asAuxLocal = ("BOMBA BLOQUEADA");
		break;
		case BOMBA_DESBLOQUEADA:
			asAuxLocal = ("BOMBA DESBLOQUEADA");
		break;
		case BOMBA_INFORMOU_FALHA:
			asAuxLocal = ("BOMBA INFORMOU FALHA");
		break;
		case BOMBA_NAO_RESPONDE:
			asAuxLocal = ("BOMBA NÃO RESPONDE");
		break;

		//--- Estados do Concentrador
		case CONCENTRADOR_INFORMOU_VERSAO:
			asAuxLocal = ("CONCENTRADOR INFORMOU VERSÃO");
		break;
		case CONCENTRADOR_ACEITOU_CONFIGURACAO:
			asAuxLocal = ("CONCENTRADOR ACEITOU CONFIGURAÇÃO");
		break;
		case FALHA_DE_COMUNICACAO_COM_CONCENTRADOR:
			asAuxLocal = ("FALHA DE COMUNICAÇÃO COM CONCENTRADOR");
		break;
		case CONCENTRADOR_INFORMOU_EVENTO:
			asAuxLocal = ("CONCENTRADOR INFORMOU EVENTO");
		break;
		case RESET_CONCENTRADOR:
			asAuxLocal = ("CONCENTRADOR RESET");
		break;

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

	//--- Rotina para autorização automática para este exemplo
	if(asAuxLocal == "BOMBA PEDE AUTORIZAÇÃO")
	{
		// A Confirmação deste cmd vêm pelo retorno do método "OnMudancaDeEstado" em "ESTADO_BOMBA_LIBERADA"
		if(Cesna->IdCodeAutorizaAbastecimento(Mab,Bomba,Bico) != (long)1)
			Display ("ERRO - Cmd Autoriza!");
    }
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::CesnaIdCodeNumAbastOff(TObject *Sender,
												unsigned_char Mab,
												long NumeroAbastecimantosOffline)
{
	Display(	"MAB: " + AnsiString((int)Mab)					+
				" - Informou Número de Abastecimentos Off - line"	);
	Display(	"Total de Abastecimentos em Memória: "			+
				AnsiString((int)NumeroAbastecimantosOffline)	);
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::CesnaIdCodeVolume(	TObject *Sender,
												unsigned_char Mab,
												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(	"Mab: " + AnsiString((int)Mab)			+
			" Bo: "	+ AnsiString((int)Bomba)		+
			" Bi: "	+ AnsiString((int)Bico)			+
			" - Último Volume: " + asAuxLocal	+
			" Litros"								);
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::CesnaIdCodePrecoPorLitro(	TObject *Sender,
													unsigned_char Mab,
													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(	"Mab: " + AnsiString((int)Mab)			+
			" Bo: "	+ AnsiString((int)Bomba)		+
			" Bi: "	+ AnsiString((int)Bico)			+
			" - Preço por Litro: R$ " + asAuxLocal	);

}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::CesnaIdCodeTotalizador(	TObject *Sender,
													unsigned_char Mab,
													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(	"Mab: " + AnsiString((int)Mab)			+
			" Bo: "	+ AnsiString((int)Bomba)		+
			" Bi: "	+ AnsiString((int)Bico)			+
			" - Totalizador Volume: " + asAuxLocal	+
			" Litros"								);
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::CesnaIdCodeValorBombaAbast(	TObject *Sender,
														unsigned_char Mab,
														unsigned_char Bomba,
														unsigned_char Bico,
														long Valor,
														unsigned_char ValorCasaDecimal)
{
AnsiString asAuxLocal = "";

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

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

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

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

   Display(	"Mab: " + AnsiString((int)Mab)			+
			" Bo: "	+ AnsiString((int)Bomba)		+
			" Bi: "	+ AnsiString((int)Bico)			+
			" - Total a Pagar Parcial: R$ " 		+
			asAuxLocal								);
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::CesnaIdCodeAbasteceu(		TObject *Sender,
													unsigned_char Mab,
													unsigned_char Bomba,
													unsigned_char Bico,
													long Volume,
													unsigned_char VolumeCasaDecimal,
													long TotalInicial,
													unsigned_char TotalInicialCasaDecimal,
													long TotalFinal,
													unsigned_char TotalFinalCasaDecimal,
													long PrecoPorLitro,
													unsigned_char PrecoPorLitroCasaDecimal,
													long Data,
													long Hora,
													BSTR TagFrentista,
													BSTR TagCliente,
													unsigned_char FlagAbastecimentoOff,
													long NumeroAbastecimento)
//---------------------------------------------------------------------------
{
AnsiString 		asAuxLocal 			= "";
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)0;
int				iContLocal 			= (int)0;
unsigned long	ulAuxLocal 			= (unsigned long)0;

	//--- 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;

	//--- Obtém TAG Frentista ----------------------------------------------
	asTagFrentLocal 	= AnsiString(TagFrentista).UpperCase();

	//--- Obtém TAG Cliente ------------------------------------------------
	asTagClientLocal	= AnsiString(TagCliente).UpperCase();

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

	Display(	"Totalizador Inicial: "			+ asTotIniLocal + " Litros"				);
	Display(	"Volume: " 						+ asVolumeLocal	+ " Litros"				);
	Display(	"Preço por Litro: R$ "			+ asPrecoLocal							);
	Display(	"Totalizador Final: "			+ asTotFinLocal + " Litros"				);
	Display(	"Hora: "						+ asHoraLocal							);
	Display(	"Data: "						+ asDataLocal							);
	Display(	"Cartão Frentista: "			+ asTagFrentLocal						);
	Display(	"Cartão Cliente   : "			+ asTagClientLocal						);
	Display(	"Indexador do Abastecimento: " 	+ AnsiString((int)NumeroAbastecimento)	);
	if(FlagAbastecimentoOff)
		Display("Abastecimento Off Line");
	else
		Display("Abastecimento On Line");

	return;
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::CesnaIdCodeConfigMab(		TObject *Sender,
													unsigned_char Mab,
													unsigned_char NumeroBombas,
													unsigned_char ModoOperacao,
													unsigned_char TipoBomba)
{
	Display("MAB: " + AnsiString((int)Mab) + " - INFORMOU CONFIGURAÇÃO");
	Display("Número de Bombas: " 	+ AnsiString((int)NumeroBombas));
	Display("Modo de Operação: " 	+ AnsiString((char)ModoOperacao));
	Display("Tipo de Bomba: " 		+ DecodificaTipoBo(TipoBomba));

	return;
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::CesnaIdCodeErroCrcTab(	TObject *Sender,
													unsigned_char Mab,
													long Crc)
{
	Display("MAB: " + AnsiString((int)Mab) + " - INFORMOU ERRO CRC");
	Display(	"CRC MAB: " 				+
				IntToHex((int)(Crc >> 8),2) +
				IntToHex((int)(Crc & 0x00FF),2));

//	Display("CRC MAB: " + AnsiString((int)Crc));
	return;
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::CesnaIdCodeInfoEvento(	TObject *Sender,
													unsigned_char Mab,
													unsigned_char Bomba,
													unsigned_char Bico,
													unsigned_char Evento)
{
	Display(	"Mab: " + AnsiString((int)Mab)			+
				" Bo: "	+ AnsiString((int)Bomba)		+
				" Bi: "	+ AnsiString((int)Bico)			+
				" - INFORMOU EVENTO"						);
	Display("Evento: " + AnsiString((int)Evento));
}
//---------------------------------------------------------------------------
//----------------- Funções Auxiliares --------------------------------------
//---------------------------------------------------------------------------
AnsiString __fastcall TFrmMain::DecodificaTipoBo(unsigned char Byte)
{
	switch(Byte)
	{
		case BOMBA_WAYNE_3G:
		return "BOMBA WAYNE 3G";

		case BOMBA_WAYNE_DUPLEX:
		return "BOMBA WAYNE DUPLEX";

		case BOMBA_WAYNE_MINNOW:
		return "BOMBA WAYNEMINNOW";

		case BOMBA_WAYNE_RIFRAN:
		return "BOMBA WAYNE RIFRAN";

		case BOMBA_GILBARCO:
		return "BOMBA GILBARCO";

		case BOMBA_STRATEMA_LOOP:
		return "BOMBA STRATEMA LOOP";

		case BOMBA_STRATEMA_RS485:
		return "BOMBA STRATEMA RS485";

		case BOMBA_STRATEMA_RS485_4800:
		return "BOMBA STRATEMA RS485 4800";

		case BOMBA_ASPRO_DEVELCO:
		return "BOMBA ASPRO DEVELCO";

		case BOMBA_ASPRO_METROVAL:
		return "BOMBA ASPRO METROVAL";

		case BOMBA_TOKHEIM:
		return "BOMBA TOKHEIM";

		default:
			return "TIPO BOMBA INDEFINIDO !!!";
	}
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::BtnObtemAbastFlashClick(TObject *Sender)
{
unsigned int	NumAbastLocal = 0;

// Este Cmd é para obter o abastecimento da Flash, tendo como parâmetro
// o número do abastecimentos que é informado no Retorno do Método "OnIdCodeAbasteceu"

	//--- Obtém Número do Abastecimento
	NumAbastLocal = (unsigned int)StrToInt(InputBox("Número do Abastecimento da Flash","Insira o Número do Abastecimento:\nDeve ser entre 0 e 299","0"));

	Cesna->IdCodeObtemAbastFlash(1,NumAbastLocal);

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