unit Ex_Integracao_Delphi;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Menus, OleServer, FcmMasterX_TLB, Mask,
  CesnaActiveX_TLB;

type
  TFrmMain = class(TForm)
    GroupBoxFcmMaster: TGroupBox;
    GroupBoxFcmSlave: TGroupBox;
    GroupBoxBombas: TGroupBox;
    BtnFcmOpen1: TButton;
    BtnFcmOpen2: TButton;
    BtnFcmOpen3: TButton;
    BtnClose: TButton;
    BtnVersaoDll: TButton;
    Label1: TLabel;
    Label2: TLabel;
    RdoGroupModoOper: TRadioGroup;
    BtnVersaoSlave: TButton;
    BtnConfigura: TButton;
    BtnAutoriza: TButton;
    BtnTrava: TButton;
    BtnUltVol: TButton;
    BtnDestrava: TButton;
    BtnObtemPpl: TButton;
    BtnTot: TButton;
    BtnTrocaPpl: TButton;
    BtnPrePago: TButton;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    ChBoxAutoriza: TCheckBox;
    Label8: TLabel;
    MemDisp: TMemo;
    Label9: TLabel;
    Label10: TLabel;
    MainMenu1: TMainMenu;
    File1: TMenuItem;
    Operaes1: TMenuItem;
    ObtemEncerrantes1: TMenuItem;
    BtnStatusBo: TButton;
    Label11: TLabel;
    BtnConfigTot: TButton;
    RdoGroupTipoMsgAbast: TRadioGroup;
    CmbBoxNumSl: TComboBox;
    CmbBoxNumBo: TComboBox;
    CmbBoxSlave: TComboBox;
    CmbBoxBomba: TComboBox;
    CmbBoxBico: TComboBox;
    MEdtPpl: TMaskEdit;
    MEdtPrePago: TMaskEdit;
    MEdtTotMec: TMaskEdit;
    ChbTodas: TCheckBox;
    Cesna: TCesna;
    procedure FormCreate(Sender: TObject);
    procedure BtnFcmOpen1Click(Sender: TObject);
    procedure BtnFcmOpen2Click(Sender: TObject);
    procedure BtnFcmOpen3Click(Sender: TObject);
    procedure BtnCloseClick(Sender: TObject);
    procedure BtnVersaoDllClick(Sender: TObject);
    procedure BtnVersaoSlaveClick(Sender: TObject);
    procedure BtnConfiguraClick(Sender: TObject);
    procedure BtnAutorizaClick(Sender: TObject);
    procedure BtnTravaClick(Sender: TObject);
    procedure BtnDestravaClick(Sender: TObject);
    procedure BtnUltVolClick(Sender: TObject);
    procedure BtnObtemPplClick(Sender: TObject);
    procedure BtnTotClick(Sender: TObject);
    procedure BtnTrocaPplClick(Sender: TObject);
    procedure BtnPrePagoClick(Sender: TObject);
    procedure ObtemEncerrantes1Click(Sender: TObject);
    procedure BtnConfigTotClick(Sender: TObject);
    procedure BtnStatusBoClick(Sender: TObject);
    procedure CesnaFcmMudancaDeEstado(ASender: TObject; Slave, Bomba, Bico,
      Estado: Byte);
    procedure CesnaFcmErroDLL(ASender: TObject; Erro: Byte);
    procedure CesnaFcmEventoSlave(ASender: TObject; Slave, Bomba,
      Bico: Byte; Evento: Integer);
    procedure CesnaFcmPrecoPorLitro(ASender: TObject; Slave, Bomba,
      Bico: Byte; PrecoPorLitro: Integer; PrecoPorLitroCasaDecimal: Byte);
    procedure CesnaFcmTotalizador(ASender: TObject; Slave, Bomba,
      Bico: Byte; Totalizador: Integer; TotalizadorCasaDecimal: Byte);
    procedure CesnaFcmVersaoFcmSlave(ASender: TObject; Slave: Byte;
      Versao: Integer);
    procedure CesnaFcmVolume(ASender: TObject; Slave, Bomba, Bico: Byte;
      Volume: Integer; VolumeCasaDecimal: Byte);
    procedure CesnaRetornoEspecial(ASender: TObject; Slave, Bomba,
      Bico: Byte; CodigoRetorno, Retorno1, Retorno2, Retorno3: Integer);
    procedure CesnaFcmAbasteceu(ASender: TObject; Slave, Bomba, Bico: Byte;
      Volume, TotalInicial, TotalFinal, PrecoPorLitro: Integer;
      VolumeCasaDecimal, TotalInicialCasaDecimal, TotalFinalCasaDecimal,
      PrecoPorLitroCasaDecimal: Byte; Hora, Data: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
//--- Variáveis Globais
    RespTotal     :array[1..4,1..16,1..4] of Integer; // Conterá o totalizador Recebido
    RespCdTot     :array[1..4,1..16,1..4] of Integer; // Conterá a casa decimal do totalizador recebido
  	FlagObtemTotal:array[1..16]           of Byte;	  // Indicador de recebimento total
    FlagOpen      :array[1..4]            of Integer; // Array de controle de solicitação de Open
    Master:Byte;                                      // Var Global para FcmMaster
    Slave:Byte;                                       // Var Global para FcmSlave
    Bomba:Byte;                                       // Var Global para Bomba
    Bico:Byte;                                        // Var Global para Bico
//--- Funções Globais    
    procedure Display(x : string);                    // Função imprime dislplay eventos
  end;

var
  FrmMain: TFrmMain;


implementation
uses Ex_ConfereEncerrantes;// Add form encerrantes

{$R *.dfm}
//------------------------------------------------------------------------------
procedure TFrmMain.FormCreate(Sender: TObject);
begin
//--- Inicialização de Variáveis
RdoGroupModoOper.ItemIndex      := 0;     // Inicializa Radio Group Modo Operação.
RdoGroupTipoMsgAbast.ItemIndex  := 1;     // Inicializa Radio Group Formato Msg
ChBoxAutoriza.Checked           := true;  // Caixa autoriza inicia marcada.

//--- Inicialização de Objetos
MemDisp.Text := '';
end;
//------------------------------------------------------------------------------
procedure TFrmMain.Display(x : string);
begin

  MemDisp.Text := MemDisp.Text + x ;
  MemDisp.Lines.add( '');
end;
//------------------------------------------------------------------------------
//------------ Group Box Comandos FcmMaster USB --------------------------------
//------------------------------------------------------------------------------
procedure TFrmMain.BtnFcmOpen1Click(Sender: TObject);
var
  ModoOperacao:Byte;      // Var que conterá o modo de operação
  FormatoMsgAbast:Byte;   // Var que conterá o Formato da Msg de Abastecimento.
begin
Master          := 1;
Slave           := Master;
Bomba           := strtoint(CmbBoxNumBo.Text); // Obtem número da(s) Bomba(s).
Bico            := 1;
ModoOperacao    := 0;                       // Inicialização de Variáveis.
FormatoMsgAbast := 0;                       // Inicialização de Variáveis.

  display ('Device= ' + inttostr(Master));
  if(FlagOpen[Master] = 1) then
  begin
      Display('Erro - FcmOpen ' + inttostr(Master) + ' Já Efetuado!');
      Exit;
  end
  else
  begin
    If (Cesna.FcmOpen(Master) = 1) Then
    begin
      FlagOpen[Master] := 1;//Seta flag se open ok
      If(Cesna.FcmSetNumSlaves(Slave) = 1) Then
      begin
        case (RdoGroupModoOper.ItemIndex) of    //Setar o Modo de Operação Utilizado pelo Posto
          0:
            ModoOperacao := $0A;// Modo A de operação
          1:
            ModoOperacao := $0B;// Modo B de operação
          2:
            ModoOperacao := $0C;// Modo C de operação
        end;
        FormatoMsgAbast := (RdoGroupTipoMsgAbast.ItemIndex +1) ;

        if(Cesna.FcmConfigConcentrador(Slave, Bomba, ModoOperacao, FormatoMsgAbast) = 1) Then
        begin
          Display ('FcmOpen 1 - OK');
        end
        Else
          Display ('Erro - FcmConfiguraSlave');
        end
      Else
        Display ('Erro - FcmSetNumSlaves');
      end
    Else
      Display ('Erro - FcmOpen');
  end;
end;
//------------------------------------------------------------------------------
procedure TFrmMain.BtnFcmOpen2Click(Sender: TObject);
var
  ModoOperacao:Byte;      // Var que conterá o modo de operação
  FormatoMsgAbast:Byte;   // Var que conterá o Formato da Msg de Abastecimento.
begin
Master          := 2;
Slave           := Master;
Bomba           := strtoint(CmbBoxNumBo.Text); // Obtem número da(s) Bomba(s).
Bico            := 1;
ModoOperacao    := 0;                       // Inicialização de Variáveis.
//FormatoMsgAbast := 0;                       // Inicialização de Variáveis.

  display ('Device= ' + inttostr(Master));
  if(FlagOpen[Master] = 1) then
  begin
      Display('Erro - FcmOpen ' + inttostr(Master) + ' Já Efetuado!');
      Exit;
  end
  else
  begin
    If (Cesna.FcmOpen(Master) = 1) Then
    begin
      FlagOpen[Master] := 1;//Seta flag se open ok
      If(Cesna.FcmSetNumSlaves(Slave) = 1) Then
      begin
        case (RdoGroupModoOper.ItemIndex) of    //Setar o Modo de Operação Utilizado pelo Posto
          0:
            ModoOperacao := $0A;// Modo A de operação
          1:
            ModoOperacao := $0B;// Modo B de operação
          2:
            ModoOperacao := $0C;// Modo C de operação
        end;
        FormatoMsgAbast := (RdoGroupTipoMsgAbast.ItemIndex +1) ;

        if(Cesna.FcmConfigConcentrador(Slave, Bomba, ModoOperacao, FormatoMsgAbast) = 1) Then
        begin
          Display ('FcmOpen 2 - OK');
        end
        Else
          Display ('Erro - FcmConfiguraSlave');
        end
      Else
        Display ('Erro - FcmSetNumSlaves');
      end
    Else
      Display ('Erro - FcmOpen');
  end;
end;
//------------------------------------------------------------------------------
procedure TFrmMain.BtnFcmOpen3Click(Sender: TObject);
var
  ModoOperacao:Byte;      // Var que conterá o modo de operação
  FormatoMsgAbast:Byte;   // Var que conterá o Formato da Msg de Abastecimento.
begin
Master          := 3;
Slave           := Master;
Bomba           := strtoint(CmbBoxNumBo.Text); // Obtem número da(s) Bomba(s).
Bico            := 1;
ModoOperacao    := 0;                       // Inicialização de Variáveis.
//FormatoMsgAbast := 0;                       // Inicialização de Variáveis.

  display ('Device= ' + inttostr(Master));
  if(FlagOpen[Master] = 1) then
  begin
      Display('Erro - FcmOpen ' + inttostr(Master) + ' Já Efetuado!');
      Exit;
  end
  else
  begin
    If (Cesna.FcmOpen(Master) = 1) Then
    begin
      FlagOpen[Master] := 1;//Seta flag se open ok
      If(Cesna.FcmSetNumSlaves(Slave) = 1) Then
      begin
        case (RdoGroupModoOper.ItemIndex) of    //Setar o Modo de Operação Utilizado pelo Posto
          0:
            ModoOperacao := $0A;// Modo A de operação
          1:
            ModoOperacao := $0B;// Modo B de operação
          2:
            ModoOperacao := $0C;// Modo C de operação
        end;
        FormatoMsgAbast := (RdoGroupTipoMsgAbast.ItemIndex +1) ;

        if(Cesna.FcmConfigConcentrador(Slave, Bomba, ModoOperacao, FormatoMsgAbast) = 1) Then
        begin
          Display ('FcmOpen 3 - OK');
        end
        Else
          Display ('Erro - FcmConfiguraSlave');
        end
      Else
        Display ('Erro - FcmSetNumSlaves');
      end
    Else
      Display ('Erro - FcmOpen');
  end;
end;
//------------------------------------------------------------------------------
procedure TFrmMain.BtnCloseClick(Sender: TObject);
begin
  Cesna.FcmClose;
  FlagOpen[1] := 0;         // Limpa flag FcmMaster 1
  FlagOpen[2] := 0;         // Limpa flag FcmMaster 2
  FlagOpen[3] := 0;         // Limpa flag FcmMaster 3
  Display('FcmClose - OK'); // Close no Display
end;
//------------------------------------------------------------------------------
procedure TFrmMain.BtnVersaoDllClick(Sender: TObject);
var
  AuxStr :AnsiString;
begin

	AuxStr :=  AnsiString(IntToStr(Cesna.FcmVersaoFcmMaster()));

	case (Length(AuxStr))of

    1:
			Display (String('Versao FcmMaster V 000' + AuxStr));
		2:
			Display(String('Versao FcmMaster V 00' + AuxStr));
		3:
			Display (String('Versao FcmMaster V 0' + AuxStr));
		4:
			Display (String('Versao FcmMaster V ' + AuxStr));
  end;
end;
//------------------------------------------------------------------------------
//------------ Group Box Comandos Concentrador Fcm -----------------------------
//------------------------------------------------------------------------------
procedure TFrmMain.BtnVersaoSlaveClick(Sender: TObject);
begin
  Cesna.FcmSolicitaVersaoSlave(strtoint(CmbBoxNumSl.Text));
end;
//------------------------------------------------------------------------------
procedure TFrmMain.BtnConfiguraClick(Sender: TObject);
var
  ModoOperacao:Byte;      // Var que conterá o modo de operação
  FormatoMsgAbast:Byte;   // Var que conterá o Formato da Msg de Abastecimento.
begin

Slave           := strtoint(CmbBoxNumSl.Text); // Obtem número do FcmSlave
Bomba           := strtoint(CmbBoxNumBo.Text); // Obtem número da(s) Bomba(s).
ModoOperacao    := 0;                       // Inicialização de Variáveis.
FormatoMsgAbast := 0;                       // Inicialização de Variáveis.

  //-- Obtem Modo de Operação
  case (RdoGroupModoOper.ItemIndex) of
    0:
      ModoOperacao := $0A;// Modo A de operação
    1:
      ModoOperacao := $0B;// Modo B de operação
    2:
      ModoOperacao := $0C;// Modo C de operação
  end;

  //-- Obtem Formato Msg de Abastecimento  
  case (RdoGroupTipoMsgAbast.ItemIndex) of
    0:
      FormatoMsgAbast := 1;
    1:
      FormatoMsgAbast := 2;
  end;

  if(Cesna.FcmConfigConcentrador(Slave, Bomba, ModoOperacao, FormatoMsgAbast) <> 1) Then
    Display('Erro - FcmConfigConcentradorFcm');

end;
//------------------------------------------------------------------------------
//------------ Group Box Comandos Bombas ---------------------------------------
//------------------------------------------------------------------------------
procedure TFrmMain.BtnAutorizaClick(Sender: TObject);
begin
//--- Obtem endereços
Slave := strtoint(CmbBoxSlave.Text); // Obtem número do FcmSlave
Bomba := strtoint(CmbBoxBomba.Text); // Obtem número da Bomba.
Bico  := strtoint(CmbBoxBico.Text);  // Obtem número do Bico.

  //autoriza a bomba para iniciar abastecimento
  if (Cesna.FcmAutorizaAbastecimento(Slave,Bomba,Bico) <> 1) Then
      Display ('sl=' + IntToStr(Slave) + ' bo=' + IntToStr(Bomba) + ' bi=' + IntToStr(Bico) + ' - Erro - FcmAutorizaAbastecimento');
end;
//------------------------------------------------------------------------------
procedure TFrmMain.BtnTravaClick(Sender: TObject);
begin
//--- Obtem endereços
Slave := strtoint(CmbBoxSlave.Text); // Obtem número do FcmSlave
Bomba := strtoint(CmbBoxBomba.Text); // Obtem número da Bomba.
Bico  := strtoint(CmbBoxBico.Text);  // Obtem número do Bico.

  //solicita o travamento da respectiva Bomba.
  if (Cesna.FcmTravaBomba(Slave, Bomba) <> 1) Then
    Display ('sl=' + IntToStr(Slave) + ' bo=' + IntToStr(Bomba) + ' bi=' + IntToStr(Bico) + ' - Erro - FcmTravaBomba');
end;
//------------------------------------------------------------------------------
procedure TFrmMain.BtnDestravaClick(Sender: TObject);
begin
//--- Obtem endereços
Slave := strtoint(CmbBoxSlave.Text); // Obtem número do FcmSlave
Bomba := strtoint(CmbBoxBomba.Text); // Obtem número da Bomba.
Bico  := strtoint(CmbBoxBico.Text);  // Obtem número do Bico.

  //solicita o Destravamento da respectiva Bomba.
  if (Cesna.FcmDesTravaBomba(Slave, Bomba) <> 1) Then
    Display ('sl=' + IntToStr(Slave) + ' bo=' + IntToStr(Bomba) + ' bi=' + IntToStr(Bico) + ' - Erro - FcmDesTravaBomba');
end;
//------------------------------------------------------------------------------
procedure TFrmMain.BtnUltVolClick(Sender: TObject);
begin
//--- Obtem endereços
Slave := strtoint(CmbBoxSlave.Text); // Obtem número do FcmSlave
Bomba := strtoint(CmbBoxBomba.Text); // Obtem número da Bomba.
Bico  := strtoint(CmbBoxBico.Text);  // Obtem número do Bico.

  //solicita o volume do último abastecimento da respectiva Bomba.
  if (Cesna.FcmSolicitaUltimoVolume(Slave,Bomba,Bico) <> 1) Then
    Display ('sl=' + IntToStr(Slave) + ' bo=' + IntToStr(Bomba) + ' bi=' + IntToStr(Bico) + ' - Erro - FcmSolicitaUltimoAbastecimento');
end;
//------------------------------------------------------------------------------
procedure TFrmMain.BtnObtemPplClick(Sender: TObject);
begin
//--- Obtem endereços
Slave := strtoint(CmbBoxSlave.Text); // Obtem número do FcmSlave
Bomba := strtoint(CmbBoxBomba.Text); // Obtem número da Bomba.
Bico  := strtoint(CmbBoxBico.Text);  // Obtem número do Bico.

  //solicita o Preço por Litro da respectiva Bomba.
  if (Cesna.FcmSolicitaPrecoPorLitro(Slave,Bomba,Bico) <> 1) Then
    Display ('sl=' + IntToStr(Slave) + ' bo=' + IntToStr(Bomba) + ' bi=' + IntToStr(Bico) + ' - Erro - FcmSolicitaPrecoPorLitro');
end;
//------------------------------------------------------------------------------
procedure TFrmMain.BtnTotClick(Sender: TObject);
begin
//--- Obtem endereços
Slave := strtoint(CmbBoxSlave.Text); // Obtem número do FcmSlave
Bomba := strtoint(CmbBoxBomba.Text); // Obtem número da Bomba.
Bico  := strtoint(CmbBoxBico.Text);  // Obtem número do Bico.

  //solicita o Encerrante da respectiva Bomba.
  If (Cesna.FcmSolicitaTotalizador(Slave,Bomba,Bico) <> 1) Then
    Display ('sl=' + IntToStr(Slave) + ' bo=' + IntToStr(Bomba) + ' bi=' + IntToStr(Bico) + ' - Erro - FcmSolicitaTotalizador');
end;
//------------------------------------------------------------------------------
procedure TFrmMain.BtnTrocaPplClick(Sender: TObject);
var
Preco:integer;
begin
//--- Obtem endereços
Slave := strtoint(CmbBoxSlave.Text); // Obtem número do FcmSlave
Bomba := strtoint(CmbBoxBomba.Text); // Obtem número da Bomba.
Bico  := strtoint(CmbBoxBico.Text);  // Obtem número do Bico.

  // Solicita a troca de preço para a respectiva bomba.
  Preco   := trunc(StrToFloat(MEdtPpl.Text)*1000);
  if(Cesna.FcmTrocaPreco(Slave,Bomba,Bico,preco,3) <> 1)Then
    Display ('sl=' + IntToStr(Slave) + ' bo=' + IntToStr(Bomba) + ' bi=' + IntToStr(Bico) + ' - Erro - FcmTrocaPreco');
end;
//------------------------------------------------------------------------------
procedure TFrmMain.BtnPrePagoClick(Sender: TObject);
var
VolumePreSet:Integer;
CdVol:Byte;
begin
//--- Obtem endereços
Slave := strtoint(CmbBoxSlave.Text); // Obtem número do FcmSlave
Bomba := strtoint(CmbBoxBomba.Text); // Obtem número da Bomba.
Bico  := strtoint(CmbBoxBico.Text);  // Obtem número do Bico
CdVol := 3;                       // Casa decimal do valor

  VolumePreSet := trunc(StrToFloat(MEdtPrePago.Text)*1000);
  if(Cesna.FcmProgramaPrePago(Slave,Bomba,Bico,VolumePreSet,CdVol) <> 1)Then
      Display ('sl=' + IntToStr(Slave) + ' bo=' + IntToStr(Bomba) + ' bi=' + IntToStr(Bico) + ' - Erro - FcmProgramaPrePago');
end;
//------------------------------------------------------------------------------
procedure TFrmMain.BtnStatusBoClick(Sender: TObject);
begin
//--- Obtem endereços
Slave := strtoint(CmbBoxSlave.Text); // Obtem número do FcmSlave
Bomba := strtoint(CmbBoxBomba.Text); // Obtem número da Bomba.

// 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) Then
    Bomba := 0;

  //solicita o Status das Bombas
  if (Cesna.FcmObtemStatusBomba(Slave, Bomba) <> 1) Then
    Display ('sl=' + IntToStr(Slave) + ' bo=' + IntToStr(Bomba) + ' bi=' + IntToStr(Bico) + ' - Erro - FcmObtemStatusBomba');
end;
//------------------------------------------------------------------------------
procedure TFrmMain.BtnConfigTotClick(Sender: TObject);
var
Valor:LongInt;
begin
//--- Obtem endereços
Slave := strtoint(CmbBoxSlave.Text); // Obtem número do FcmSlave
Bomba := strtoint(CmbBoxBomba.Text); // Obtem número da Bomba.
Bico  := strtoint(CmbBoxBico.Text);  // Obtem número do Bico.

// Atenção: Esta função é utilizada somente em Concentrador Fcm para Bomba Mec com versão do Firmware 4
// V X.4.X.X

  //Configura Totalizador Bomba Mec
  Valor := trunc(StrToFloat(MEdtTotMec.Text)*1000); // Obs.: Duas Casas decimais fixas
  if(Cesna.FcmConfigTotalizador(Slave,Bomba,Bico,Valor) <> 1) Then
    Display ('sl=' + IntToStr(Slave) + ' bo=' + IntToStr(Bomba) + ' bi=' + IntToStr(Bico) + ' - Erro - FcmConfigTotalizador');
end;
//------------------------------------------------------------------------------
procedure TFrmMain.CesnaFcmErroDLL(ASender: TObject; Erro: Byte);
begin
  Case Erro of
      1:
          Display ('ERRO_LRC - Parâmetro:' + inttoStr(Erro)+ '  DLL');
      2:
          Display ('ERRO_PRT - Parâmetro:' + inttoStr(Erro)+ '  DLL');
      3:
          Display ('ERRO_FINALIZOU - Parâmetro:' + inttoStr(Erro)+ '  DLL');
  End;
end;
//------------------------------------------------------------------------------
procedure TFrmMain.CesnaFcmEventoSlave(ASender: TObject; Slave, Bomba,
  Bico: Byte; Evento: Integer);
begin
 	// Esta função é utilizada pelo suporte da Cesna, não sendo necessário sua utilização.
	Display ('sl=' + IntToStr(Slave) + ' bo=' + IntToStr(Bomba) + ' bi=' + IntToStr(Bico)+ ' - INFORMOU EVENTO ');
	if(Evento < 1000)then
  begin
		Display('EVENTO: 0' + IntToStr(Evento));
  end
	else
  begin
		Display('EVENTO: ' + IntToStr(Evento));
  end;
end;
//------------------------------------------------------------------------------
procedure TFrmMain.CesnaFcmPrecoPorLitro(ASender: TObject; Slave, Bomba,
  Bico: Byte; PrecoPorLitro: Integer; PrecoPorLitroCasaDecimal: Byte);
var preco :string;
begin
  Case PrecoPorLitroCasaDecimal of
      1:
          preco := Format('%8.1f',[PrecoPorLitro / 10]);
      2:
          preco := Format('%8.2f',[PrecoPorLitro / 100]);
      3:
          preco := Format('%8.3f',[PrecoPorLitro / 1000]);
  End;
    Display ('sl=' + inttoStr(Slave) + ' bo=' + inttoStr(Bomba) + ' bi=' + inttoStr(Bico) + ' PrecoPorLitro=' + preco);
end;
//------------------------------------------------------------------------------
procedure TFrmMain.CesnaFcmTotalizador(ASender: TObject; Slave, Bomba,
  Bico: Byte; Totalizador: Integer; TotalizadorCasaDecimal: Byte);
var total :string;
begin
    Case TotalizadorCasaDecimal of
        1:
            total := Format('%8.1f',[Totalizador / 10]);
        2:
            total := Format('%8.2f' ,[Totalizador / 100]);
        3:
            total := Format('%8.3f' ,[Totalizador / 1000]);
    End;

    if(FrmTotais.SolicitacaoAtiva = 1)Then                          // Se Solicitação do FormTatis estiver ativa.
    begin
        FlagObtemTotal[Bomba]    := 0;                              // Limpa Indicador de recepção de Totalizador da bomba.
        RespTotal[Slave][Bomba][Bico] := Totalizador;               // Armazena totalizador
        RespCdTot[Slave][Bomba][Bico] := TotalizadorCasaDecimal;    // Armazena CD Totalizador
    end;

    Display ('sl=' + inttoStr(Slave) + ' bo=' + inttoStr(Bomba) + ' bi=' + inttoStr(Bico) + ' Totalizador=' + total);
end;
//------------------------------------------------------------------------------
procedure TFrmMain.CesnaFcmVersaoFcmSlave(ASender: TObject; Slave: Byte;
  Versao: Integer);
var
TipoBomba:Byte;
Temp:String;
begin

  Temp := IntToStr(versao);

  if(Length(Temp) = 4)Then
  begin
    TipoBomba := (Byte(Temp[1]) - $30);
  end
  else
  begin
    TipoBomba := (((Byte(Temp[1]) - $30)shl 4) or (Byte(Temp[2]) - $30));
  end;
	Case(TipoBomba)Of

    1:
			Display('Bomba Gilbarco V ' + IntToStr(versao));

		2:
			Display('Bomba Wayne Duplex V ' + IntToStr(versao));

		3:
			Display('Bomba Wayne Rifran V ' + IntToStr(versao));

		4:
			Display('Bomba Aspro Develco V ' + IntToStr(versao));


	  5:
			Display('Bomba Simulador Cesna V ' + IntToStr(versao));


		6:
			Display('Bomba Mecânica Bolachão V ' + IntToStr(versao));


		7:
			Display('Bomba Wayne Minnow V ' +IntToStr(versao));

		8:
			Display('Bomba Wayne 3G V ' +IntToStr(versao));

		9:
			Display('Bomba Wayne Duplex  - Minnow V ' + IntToStr(versao));

		10:
			Display('Bomba Mecânica Veeder V ' + IntToStr(versao));

		11:
			Display('RESERVADO ' + IntToStr(versao));

		12:
			Display('Bomba Wayne 3G - Minnow V ' + IntToStr(versao));

		13:
			Display('Bomba Aspro Metroval V ' + IntToStr(versao));

		14:
			Display('Bomba Mecânica Polipetro V ' + IntToStr(versao));

		15:
			Display('Bomba Stratema V ' + IntToStr(versao));

		16:
			Display('RESERVADO ' + IntToStr(versao));

		17:
			Display('RESERVADO ' + IntToStr(versao));
  end;
end;
//------------------------------------------------------------------------------
procedure TFrmMain.CesnaFcmVolume(ASender: TObject; Slave, Bomba,
  Bico: Byte; Volume: Integer; VolumeCasaDecimal: Byte);
var vol :String;
begin

    Case VolumeCasaDecimal of
      1:
        vol := Format('%8.1f',[Volume / 10]);
      2:
        vol := Format('%8.2f',[Volume / 100]);
      3:
        vol := Format('%8.3f',[Volume / 1000]);
    End;

  Display ('sl=' + inttoStr(Slave) + ' bo=' + inttoStr(Bomba) + ' bi=' + inttoStr(Bico) + ' Volume =' + vol);
end;
//------------------------------------------------------------------------------
procedure TFrmMain.CesnaRetornoEspecial(ASender: TObject; Slave, Bomba,
  Bico: Byte; CodigoRetorno, Retorno1, Retorno2, Retorno3: Integer);
begin
	// Esta função é utilizada pelo suporte da Cesna, não sendo necessário sua utilização.
	Display('sl=' + inttoStr(Slave) + ' bo=' + inttoStr(Bomba) + ' bi=' + inttoStr(Bico) + ' - RETORNO ESPECIAL ');
	Display('CÓDIGO    : ' + inttoStr(CodigoRetorno));
	Display('Retorno   : ' + inttoStr(Retorno1));
	Display('Retorno 2 : ' + inttoStr(Retorno2));
	Display('Retorno 3 : ' + inttoStr(Retorno3));
end;
//------------------------------------------------------------------------------
procedure TFrmMain.CesnaFcmAbasteceu(ASender: TObject; Slave, Bomba,
  Bico: Byte; Volume, TotalInicial, TotalFinal, PrecoPorLitro: Integer;
  VolumeCasaDecimal, TotalInicialCasaDecimal, TotalFinalCasaDecimal,
  PrecoPorLitroCasaDecimal: Byte; Hora, Data: Integer);
var
vol       :String;
tot_ini   :String;
tot_final :String;
preco     :String;
data_abast:String;
horario   :String;
begin
    Case VolumeCasaDecimal of
        1:
            vol := Format('%8.1f',[Volume / 10]);
        2:
            vol := Format('%8.2f',[Volume / 100]);
        3:
            vol := Format('%8.3f',[Volume / 1000]);
    End;

    Case TotalInicialCasaDecimal of
        1:
            tot_ini := Format('%8.1f',[TotalInicial / 10]);
        2:
            tot_ini := Format('%8.2f',[TotalInicial / 100]);
        3:
            tot_ini := Format('%8.3f',[TotalInicial / 1000]);
    End;

    Case TotalFinalCasaDecimal of
        1:
            tot_final := Format('%8.1f',[TotalFinal / 10]);
        2:
            tot_final := Format('%8.2f',[TotalFinal / 100]);
        3:
            tot_final := Format('%8.3f',[TotalFinal / 1000]);
    End;

    Case PrecoPorLitroCasaDecimal of
        1:
            preco := Format('%8.1f',[PrecoPorLitro / 10]);
        2:
            preco := Format('%8.2f',[PrecoPorLitro / 100]);
        3:
            preco := Format('%8.3f',[PrecoPorLitro / 1000]);
    End;

    data_abast:= IntToStr(Data);
    if (Length(data_abast)=5) then
    begin
        data_abast:= '0' + data_abast;
    end;
    horario:= IntToStr(Hora);
    case Length(horario) of
       1: horario:= '00000' + horario;
       2: horario:= '0000' + horario;
       3: horario:= '000' + horario;
       4: horario:= '00' + horario;
       5: horario:= '0' + horario;
    end;

//
//    if (Length(horario)=4) then
//    begin
//        horario:= '00' + horario;
//    end;
//    if (Length(horario)=5) then
//    begin
//        horario:= '0' + horario;
//    end;
//

    Display ('sl=' + inttoStr(Slave) + ' bo=' + inttoStr(Bomba) + ' bi=' + inttoStr(Bico) + ' Abasteceu 2');
    Display ('Total Incial  =' + tot_ini);
    Display ('Volume        =' + vol);
    Display ('Total Final   =' + tot_final);
    Display ('PrecoPorLitro =' + preco);
    Display  ('Hora =' + horario[1] + horario[2] + ':' + horario[3] + horario[4] + ':' + horario[5] + horario[6]);
    Display  ('Data =' + data_abast[1] + data_abast[2] + '/' + data_abast[3] + data_abast[4] + '/' + data_abast[5] + data_abast[6]);
end;
//------------------------------------------------------------------------------
procedure TFrmMain.ObtemEncerrantes1Click(Sender: TObject);
begin
  FrmTotais.Show;
end;
//------------------------------------------------------------------------------
procedure TFrmMain.CesnaFcmMudancaDeEstado(ASender: TObject; Slave, Bomba,
  Bico, Estado: Byte);
Const ESTADO_INDEFINIDO                     = 1;
Const BOMBA_PRONTA                          = 2;
Const BOMBA_PEDE_AUTORIZACAO                = 3;
Const BOMBA_AGUARDANDO_CARTAO               = 4;
Const BOMBA_LIBERADA_PARA_ABASTECER         = 5;
Const BOMBA_ABASTECENDO                     = 6;
Const BOMBA_ABASTECEU                       = 7;
Const BOMBA_TROCOU_PRECO_POR_LITRO          = 8;
Const BOMBA_RESERVADA_PRE_PAGO              = 9;
Const BOMBA_BLOQUEADA                       = 10;
Const BOMBA_DESBLOQUEADA                    = 11;
Const BOMBA_INFORMOU_FALHA                  = 12;
Const BOMBA_NAO_RESPONDE                    = 13;
Const CONCENTRADOR_INFORMOU_VERSAO          = 14;
Const CONCENTRADOR_ACEITOU_CONFIGURACAO     = 15;
Const FALHA_DE_COMUNICACAO_COM_CONCENTRADOR = 16;
Const CONCENTRADOR_INFORMOU_EVENTO          = 17;
Const RESET_CONCENTRADOR                    = 18;
begin
  Case Estado of
    ESTADO_INDEFINIDO:
      Display ('sl=' + IntToStr(Slave) + ' bo=' + IntToStr(Bomba) + ' bi=' + IntToStr(Bico) + ' - ESTADO_BOMBA_ERRO_INDEFINIDO');

    BOMBA_PRONTA:
      Display ('sl=' + IntToStr(Slave) + ' bo=' + IntToStr(Bomba) + ' bi=' + IntToStr(Bico) + ' - ESTADO_BOMBA_PRONTA');

    BOMBA_NAO_RESPONDE:
      Display ('sl=' + IntToStr(Slave) + ' bo=' + IntToStr(Bomba) + ' bi=' + IntToStr(Bico) + ' - ESTADO_BOMBA_NAO_RESPONDE');

    BOMBA_PEDE_AUTORIZACAO:
    begin
      Display ('sl=' + IntToStr(Slave) + ' bo=' + IntToStr(Bomba) + ' bi=' + IntToStr(Bico) + ' - ESTADO_BOMBA_PEDE_AUTORIZACAO');
      if(ChBoxAutoriza.Checked) Then
        if(Cesna.FcmAutorizaAbastecimento(Slave, Bomba, Bico) <> 1) Then
          Display ('sl=' + inttoStr(Slave) + ' bo=' + inttoStr(Bomba) + ' bi=' + inttoStr(Bico)+ ' - Erro - FcmAutorizaAbastecimento');
    end;

    BOMBA_LIBERADA_PARA_ABASTECER:
      Display ('sl=' + IntToStr(Slave) + ' bo=' + IntToStr(Bomba) + ' bi=' + IntToStr(Bico) + ' - ESTADO_BOMBA_LIBERADA');

    BOMBA_ABASTECENDO:
      Display ('sl=' + IntToStr(Slave) + ' bo=' + IntToStr(Bomba) + ' bi=' + IntToStr(Bico) + ' - ESTADO_BOMBA_ABASTECENDO');

    BOMBA_ABASTECEU:
      Display ('sl=' + IntToStr(Slave) + ' bo=' + IntToStr(Bomba) + ' bi=' + IntToStr(Bico) + ' - ESTADO_BOMBA_ABASTECEU');

    BOMBA_BLOQUEADA:
      Display ('sl=' + IntToStr(Slave) + ' bo=' + IntToStr(Bomba) + ' bi=' + IntToStr(Bico) + ' - ESTADO_BOMBA_BLOQUEADA');

    BOMBA_DESBLOQUEADA:
      Display ('sl=' + IntToStr(Slave) + ' bo=' + IntToStr(Bomba) + ' bi=' + IntToStr(Bico) + ' - ESTADO_BOMBA_DESBLOQUEADA');

    BOMBA_RESERVADA_PRE_PAGO:
      Display ('sl=' + IntToStr(Slave) + ' bo=' + IntToStr(Bomba) + ' bi=' + IntToStr(Bico) + ' - ESTADO_BOMBA_RESERVADA_PREPAGO');

    BOMBA_TROCOU_PRECO_POR_LITRO:
      Display ('sl=' + IntToStr(Slave) + ' bo=' + IntToStr(Bomba) + ' bi=' + IntToStr(Bico) + ' - ESTADO_BOMBA_TROCOU_PRECO');

    FALHA_DE_COMUNICACAO_COM_CONCENTRADOR:
      Display ('sl=' + IntToStr(Slave) + ' FCM_SLAVE_NAO_RESPONDE');

    CONCENTRADOR_ACEITOU_CONFIGURACAO:
      Display ('sl=' + IntToStr(Slave) + ' FCM_SLAVE_CONFIG');


    Else
      Display ('Estado Desconhecido');
  End
end;

end.
