unit Ex_Integracao_Delphi;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Menus, OleServer, 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;
    Label11: TLabel;
    BtnObtemStatusBo: TButton;
    BtnConfigTot: TButton;
    RdoGroupFormatAbast: TRadioGroup;
    CmbBoxNumSl: TComboBox;
    CmbBoxNumBo: TComboBox;
    MEdtPpl: TMaskEdit;
    MEdtPrePago: TMaskEdit;
    MEdtTotMec: TMaskEdit;
    CmbBoxSlave: TComboBox;
    CmbBoxBomba: TComboBox;
    CmbBoxBico: TComboBox;
    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 BtnObtemStatusBoClick(Sender: TObject);
    procedure ObtemEncerrantes1Click(Sender: TObject);
    procedure BtnConfigTotClick(Sender: TObject);
    procedure CesnaFcmMudancaDeEstado(ASender: TObject; Slave, Bomba, Bico,Estado: Byte);
    procedure CesnaFcmAbasteceu(ASender: TObject; Slave, Bomba, Bico: Byte;
                                Volume, TotalInicial, TotalFinal, PrecoPorLitro: Integer;
                                VolumeCasaDecimal, TotalInicialCasaDecimal, TotalFinalCasaDecimal,
                                PrecoPorLitroCasaDecimal: Byte; Hora, Data: Integer);
    procedure CesnaFcmErroDLL(ASender: TObject; Erro: Byte);
    procedure CesnaFcmEventoSlave(ASender: TObject; Slave, Bomba, Bico: Byte; Evento: Integer);
    procedure CesnaFcmVolume(ASender: TObject; Slave, Bomba, Bico: Byte;
                             Volume: Integer; VolumeCasaDecimal: Byte);
    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 CesnaRetornoEspecial( ASender: TObject; Slave, Bomba, Bico: Byte;
                                    CodigoRetorno, Retorno1, Retorno2, Retorno3: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure Display(x : AnsiString);// Função imprime dislplay eventos

//--- Variáveis Globais
var
  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 Boolean;	  // Indicador de recebimento total
  FlagOpen      :array[1..4]            of Boolean; // 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

  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 Operãção
RdoGroupFormatAbast.ItemIndex := 1;     // Inicializa Radio Group Formato Mensagem Abastecimento
ChBoxAutoriza.Checked         := true;  // Caixa autoriza inicia marcada.

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

  MemDisp.Text := MemDisp.Text + String(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 mensagem de abastecimento.
begin
Master := 1;
Slave  := Master;
Bomba  := StrToInt(CmbBoxNumBo.Text);
Bico   := 1;

//  Display ('Device= ' + IntToStr(Master));
  Display (AnsiString('Device= ' + IntToStr(Master)));
  if(FlagOpen[Master] = True) then
  begin
      Display(AnsiString('Erro - FcmOpen ' + IntToStr(Master)+ ' Já Efetuado!'));
      Exit;
  end
  else
    begin

      If (Cesna.FcmOpen(Master) = 1) Then
      begin
        FlagOpen[Master] := True;//Seta flag se open ok
        If (Cesna.FcmSetNumSlaves(Slave) = 1) Then
        begin

            // Setar Modo de Operação Utilizado Pelo Posto
            ModoOperacao := 0;              // Inicializa Var
            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;
            // Configuração do Formato de Mensagem de Abastecimento
            FormatoMsgAbast := (RdoGroupFormatAbast.ItemIndex + 1);

            If(Cesna.FcmConfigConcentrador(Slave,Bomba,ModoOperacao,FormatoMsgAbast) = 1)Then
            begin
              Display ('FcmOpen - 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 mensagem de abastecimento.
begin
Master := 2;
Slave  := Master;
Bomba  := StrToInt(CmbBoxNumBo.Text);
Bico   := 1;

  display (AnsiString('Device= ' + IntToStr(Master)));
  if(FlagOpen[Master] = True) then
  begin
      Display(AnsiString('Erro - FcmOpen ' + IntToStr(Master) + ' Já Efetuado!'));
      Exit;
  end
  else
    begin
      If (Cesna.FcmOpen(Master) = 1) Then
      begin
        FlagOpen[Master] := True;//Seta flag se open ok
        If (Cesna.FcmSetNumSlaves(Slave) = 1) Then
        begin

            // Setar Modo de Operação Utilizado Pelo Posto
            ModoOperacao := 0;              // Inicializa Var
            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;
            // Configuração do Formato de Mensagem de Abastecimento
            FormatoMsgAbast := (RdoGroupFormatAbast.ItemIndex + 1);

            If(Cesna.FcmConfigConcentrador(Slave,Bomba,ModoOperacao,FormatoMsgAbast) = 1)Then
            begin
                Display ('FcmOpen - 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 mensagem de abastecimento.
begin
Master := 3;
Slave  := Master;
Bomba  := StrToInt(CmbBoxNumBo.Text);
Bico   := 1;

  display (AnsiString('Device= ' + IntToStr(Master)));
  if(FlagOpen[Master] = True) then
  begin
      Display(AnsiString('Erro - FcmOpen ' + IntToStr(Master) + ' Já Efetuado!'));
      Exit;
  end
  else
    begin
      If (Cesna.FcmOpen(Master) = 1) Then
      begin
        FlagOpen[Master] := True;//Seta flag se open ok
        If (Cesna.FcmSetNumSlaves(Slave) = 1) Then
        begin

            // Setar Modo de Operação Utilizado Pelo Posto
            ModoOperacao := 0;              // Inicializa Var
            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;
            // Configuração do Formato de Mensagem de Abastecimento
            FormatoMsgAbast := (RdoGroupFormatAbast.ItemIndex + 1);

            If(Cesna.FcmConfigConcentrador(Slave,Bomba,ModoOperacao,FormatoMsgAbast) = 1)Then
             begin
                Display ('FcmOpen - 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] := False;     // Limpa flag FcmMaster 1
  FlagOpen[2] := False;     // Limpa flag FcmMaster 2
  FlagOpen[3] := False;     // Limpa flag FcmMaster 3
  Display('FcmClose - OK'); // Close no Display
end;
//------------------------------------------------------------------------------
procedure TFrmMain.BtnVersaoDllClick(Sender: TObject);
var
  AuxStr :AnsiString;
begin

//	AuxStr :=  AnsiString(FcmMaster.FcmVersaoFcmMaster());

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

	case (Length(AuxStr))of

    1:
			Display ('Versao FcmMaster V 000' + AuxStr);
		2:
			Display('Versao FcmMaster V 00' + AuxStr);
		3:
			Display ('Versao FcmMaster V 0' + AuxStr);
		4:
			Display ('Versao FcmMaster V ' + AuxStr);
  end;
end;
//------------------------------------------------------------------------------
//------------ Group Box Comandos Concentrador Fcm -----------------------------
//------------------------------------------------------------------------------
procedure TFrmMain.BtnVersaoSlaveClick(Sender: TObject);
begin
  // A resposta a Este cmd vêm pelo retorno do método "OnVersaoFcmSlave"
  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 mensagem de abastecimento.
begin
//--- Inicializa Variáveis
Slave := strtoint(CmbBoxNumSl.Text); // Obtem número do FcmSlave
Bomba := strtoint(CmbBoxNumBo.Text); // Obtem número da(s) Bomba(s).

  //-------- Configura Modo de Operação ----------------------------------------
  ModoOperacao := 0;              // Inicializa Var
  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;

  //-------- Configura Formato Mensagem Abastecimento --------------------------
 // FormatoMsgAbast := 0;           // Inicializa Var
  FormatoMsgAbast := (RdoGroupFormatAbast.ItemIndex + 1);

  // 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)Then
    Display('Erro - FcmConfiguraSlave');
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.

  // A Confirmação deste cmd vêm pelo retorno do método "OnMudancaDeEstado" em "ESTADO_BOMBA_LIBERADA"
  //autoriza a bomba para iniciar abastecimento
  if (Cesna.FcmAutorizaAbastecimento(Slave,Bomba,Bico) <> 1) Then
      Display (AnsiString('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.

  // A Confirmação deste cmd vêm pelo retorno do método "OnMudancaDeEstado" em "ESTADO_BOMBA_BLOQUEADA"
  //solicita o travamento da respectiva Bomba.
  if (Cesna.FcmTravaBomba(Slave, Bomba) <> 1) Then
    Display (AnsiString('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.

  // A Confirmação deste cmd vêm pelo retorno do método "OnMudancaDeEstado" em "ESTADO_BOMBA_DESBLOQUEADA"
  //solicita o Destravamento da respectiva Bomba.
  if (Cesna.FcmDesTravaBomba(Slave, Bomba) <> 1) Then
    Display (AnsiString('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.

  // A Resposta deste cmd vêm pelo retorno do método "OnVolume"
  //solicita o volume do último abastecimento da respectiva Bomba.
  if (Cesna.FcmSolicitaUltimoVolume(Slave,Bomba,Bico) <> 1) Then
    Display (AnsiString('sl=' + IntToStr(Slave) + ' bo=' + IntToStr(Bomba) + ' bi=' + IntToStr(Bico) + ' - Erro - FcmSolicitaUltimoVolume'));
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.

  // A Resposta deste cmd vêm pelo retorno do método "OnPrecoPorLitro"
  //solicita o Preço por Litro da respectiva Bomba.
  if(Cesna.FcmSolicitaPrecoPorLitro(Slave,Bomba,Bico) <> 1) Then
    Display (AnsiString('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.

  // A Resposta deste cmd vêm pelo retorno do método "OnTotalizador"
  //solicita o Encerrante da respectiva Bomba.
  If (Cesna.FcmSolicitaTotalizador(Slave,Bomba,Bico) <> 1) Then
    Display (AnsiString('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.

  // A Confirmação deste cmd vêm pelo retorno do método "OnMudancaDeEstado" em "ESTADO_BOMBA_TROCOU_PRECO"
  // 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 (AnsiString('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);
  // A Confirmação deste cmd vêm pelo retorno do método "OnMudancaDeEstado" em "ESTADO_BOMBA_RESERVADA_PREPAGO"
  // Solicita o Pre-Set em Volume para a respectiva bomba.
  if(Cesna.FcmProgramaPrePago(Slave,Bomba,Bico,VolumePreSet,&CdVol) <> 1)Then
      Display (AnsiString('sl=' + IntToStr(Slave) + ' bo=' + IntToStr(Bomba) + ' bi=' + IntToStr(Bico) + ' - Erro - FcmProgramaPrePago'));
end;
//------------------------------------------------------------------------------
procedure TFrmMain.BtnObtemStatusBoClick(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 = TRUE then
    Bomba := 0;

  // A Resposta deste cmd vêm pelo retorno do método "OnMudancaDeEstado" de acordo com o estado de cada bomba.
  //solicita o Status das Bombas
  if (Cesna.FcmObtemStatusBomba(Slave, Bomba) <> 1) Then
    Display (AnsiString('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 Concentrador Fcm p/ Bomba Mecânica V 4.x.x
  // A aceitação deste cmd vêm pelo retorno do método "OnMudancaDeEstado" em "FCM_SLAVE_CONFIG".
  Valor := trunc(StrToFloat(MEdtTotMec.Text)*1000); // Obs.: Duas Casas decimais fixas
  if(Cesna.FcmConfigTotalizador(Slave,Bomba,Bico,Valor) <> 1) Then
    Display (AnsiString('sl=' + IntToStr(Slave) + ' bo=' + IntToStr(Bomba) + ' bi=' + IntToStr(Bico) + ' - Erro - FcmConfigTotalizador'));
end;
//------------------------------------------------------------------------------
procedure TFrmMain.ObtemEncerrantes1Click(Sender: TObject);
begin
  FrmTotais.Show;
end;
//------------------------------------------------------------------------------
//******************* Retornos dos Métodos CesnaActiveX ------------------------
//------------------------------------------------------------------------------
procedure TFrmMain.CesnaFcmAbasteceu(ASender: TObject; Slave, Bomba, Bico: Byte;
                                      Volume, TotalInicial, TotalFinal, PrecoPorLitro: Integer; 
                                      VolumeCasaDecimal,TotalInicialCasaDecimal, TotalFinalCasaDecimal,PrecoPorLitroCasaDecimal: Byte;
                                      Hora, Data: Integer);
var
StrVolumeLocal:String;
StrTotalLocal:String;
StrTotalIniLocal:String;
StrPrecoLocal:String;
StrDataLocal:String;
StrHorarioLocal:String;
begin
    Case VolumeCasaDecimal of
        0:
            StrVolumeLocal := Format('%8.0f',[Volume / 1]);
        1:
            StrVolumeLocal := Format('%8.1f',[Volume / 10]);
        2:
            StrVolumeLocal := Format('%8.2f',[Volume / 100]);
        3:
            StrVolumeLocal := Format('%8.3f',[Volume / 1000]);
    End;
    Case TotalInicialCasaDecimal of
        0:
            StrTotalIniLocal := Format('%8.0f',[TotalInicial / 1]);
        1:
            StrTotalIniLocal := Format('%8.1f',[TotalInicial / 10]);
        2:
            StrTotalIniLocal := Format('%8.2f',[TotalInicial / 100]);
        3:
            StrTotalIniLocal := Format('%8.3f',[TotalInicial/ 1000]);
    End;
    Case TotalFinalCasaDecimal of
        0:
            StrTotalLocal := Format('%8.0f',[TotalFinal / 1]);
        1:
            StrTotalLocal := Format('%8.1f',[TotalFinal / 10]);
        2:
            StrTotalLocal := Format('%8.2f',[TotalFinal / 100]);
        3:
            StrTotalLocal := Format('%8.3f',[TotalFinal/ 1000]);
    End;
    Case PrecoPorLitroCasaDecimal of
        0:
            StrPrecoLocal := Format('%8.0f',[PrecoPorLitro / 1]);    
        1:
            StrPrecoLocal := Format('%8.1f',[PrecoPorLitro / 10]);
        2:
            StrPrecoLocal := Format('%8.2f',[PrecoPorLitro / 100]);
        3:
            StrPrecoLocal := Format('%8.3f',[PrecoPorLitro / 1000]);
    End;

    Display (AnsiString('Sl=' + IntToStr(Slave) + ' Bo=' + IntToStr(Bomba) + ' Bi=' + IntToStr(Bico) + ' Abasteceu'));
    Display (AnsiString('Total Inicial ='   + StrTotalIniLocal));
    Display (AnsiString('Volume ='          + StrVolumeLocal));
    Display (AnsiString('Total Final ='     + StrTotalLocal));
    Display (AnsiString('PrecoPorLitro ='   + StrPrecoLocal));
    StrDataLocal:= IntToStr(Data);
    if (Length(StrDataLocal)=5) then
    begin
        StrDataLocal:= '0' + StrDataLocal;
    end;
    StrHorarioLocal:= IntToStr(Hora);

     case Length(StrHorarioLocal) of
          1:   StrHorarioLocal:= '00000'  + StrHorarioLocal;
          2:   StrHorarioLocal:= '0000'   + StrHorarioLocal;
          3:   StrHorarioLocal:= '000'    + StrHorarioLocal;
          4:   StrHorarioLocal:= '00'     + StrHorarioLocal;
          5:   StrHorarioLocal:= '0'      + StrHorarioLocal;
     end;

    Display  (AnsiString('Hora =' + StrHorarioLocal[1] + StrHorarioLocal[2] + ':' + StrHorarioLocal[3] + StrHorarioLocal[4] + ':' + StrHorarioLocal[5] + StrHorarioLocal[6]));
    Display  (AnsiString('Data =' + StrDataLocal[1] + StrDataLocal[2] + '/' + StrDataLocal[3] + StrDataLocal[4] + '/' + StrDataLocal[5] + StrDataLocal[6]));

end;
//------------------------------------------------------------------------------
procedure TFrmMain.CesnaFcmErroDLL(ASender: TObject; Erro: Byte);
begin
  Case Erro of
      20:
          Display (AnsiString('ERRO_LRC - Parâmetro:' + IntToStr(erro)+ '  DLL'));
      21:
          Display (AnsiString('ERRO_PRT - Parâmetro:' + IntToStr(erro)+ '  DLL'));
      22:
          Display (AnsiString('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 (AnsiString('Sl=' + IntToStr(Slave) + ' Bo=' + IntToStr(Bomba) + ' Bi=' + IntToStr(Bico)+ ' - INFORMOU EVENTO '));
	if(Evento < 1000)then
  begin
		Display(AnsiString('EVENTO: 0' + IntToStr(Evento)));
  end
	else
  begin
		Display(AnsiString('EVENTO: ' + IntToStr(Evento)));
  end;
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;

var
StrAuxLocal:String;

begin
  StrAuxLocal := '';

  Case Estado of
    ESTADO_INDEFINIDO:
      StrAuxLocal := ('BOMBA ESTADO INDEFINIDO');

    BOMBA_PRONTA:
      StrAuxLocal := ('BOMBA PRONTA');

    BOMBA_PEDE_AUTORIZACAO:
    begin
      StrAuxLocal := ('BOMBA PEDE AUTORIZAÇÃO');
    end;

    BOMBA_AGUARDANDO_CARTAO:
      StrAuxLocal := ('BOMBA AGUARDANDO CARTÃO');

    BOMBA_LIBERADA_PARA_ABASTECER:
      StrAuxLocal := ('BOMBA LIBERADA PARA ABASTECER');

    BOMBA_ABASTECENDO:
      StrAuxLocal := ('BOMBA ABASTECENDO');

    BOMBA_ABASTECEU:
      StrAuxLocal := ('BOMBA ABASTECEU');

    BOMBA_TROCOU_PRECO_POR_LITRO:
      StrAuxLocal := ('BOMBA TROCOU PRECO POR LITRO');

    BOMBA_RESERVADA_PRE_PAGO:
      StrAuxLocal := ('BOMBA RESERVADA PRE PAGO');

    BOMBA_BLOQUEADA:
      StrAuxLocal := ('BOMBA BLOQUEADA');

    BOMBA_DESBLOQUEADA:
      StrAuxLocal := ('BOMBA DESBLOQUEADA');

    BOMBA_INFORMOU_FALHA:
      StrAuxLocal := ('BOMBA INFORMOU FALHA');

    BOMBA_NAO_RESPONDE:
      StrAuxLocal := ('BOMBA NAO RESPONDE');

    CONCENTRADOR_INFORMOU_VERSAO:
      StrAuxLocal := ('CONCENTRADOR INFORMOU VERSAO');

    CONCENTRADOR_ACEITOU_CONFIGURACAO:
      StrAuxLocal := ('CONCENTRADOR ACEITOU CONFIGURACAO');

    FALHA_DE_COMUNICACAO_COM_CONCENTRADOR:
      StrAuxLocal := ('FALHA DE COMUNICACAO COM CONCENTRADOR');

    CONCENTRADOR_INFORMOU_EVENTO :
      StrAuxLocal := ('CONCENTRADOR INFORMOU EVENTO');

    RESET_CONCENTRADOR:
      StrAuxLocal := ('RESET CONCENTRADOR');

//      Display ('Estado Desconhecido');
  end;



  Display(AnsiString('Sl=' + IntToStr(Slave) + ' Bo=' + IntToStr(Bomba) + ' Bi=' + IntToStr(Bico) + ' - ' + StrAuxLocal));

  //--- Rotina para autorização automática para este exemplo.
  if(StrAuxLocal = ('BOMBA PEDE AUTORIZAÇÃO'))Then
  begin
      if(ChBoxAutoriza.Checked) Then
        if(Cesna.FcmAutorizaAbastecimento(Slave,Bomba,Bico) <> 1) Then
          Display (AnsiString('Sl=' + IntToStr(Slave) + ' Bo=' + IntToStr(Bomba) + ' Bi=' + IntToStr(Bico)+ ' - Erro - FcmAutorizaAbastecimento'));
  end;
end;
//------------------------------------------------------------------------------
procedure TFrmMain.CesnaFcmVolume(ASender: TObject; Slave, Bomba, Bico: Byte;Volume: Integer; VolumeCasaDecimal: Byte);
var
StrVolumeLocal :String;
begin

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

  Display (AnsiString('Sl=' + IntToStr(Slave) + ' Bo=' + IntToStr(Bomba) + ' Bi=' + IntToStr(Bico) + ' Volume =' + StrVolumeLocal));
end;
//------------------------------------------------------------------------------
procedure TFrmMain.CesnaFcmPrecoPorLitro(ASender: TObject; Slave, Bomba,
  Bico: Byte; PrecoPorLitro: Integer; PrecoPorLitroCasaDecimal: Byte);
var
StrPrecoLocal:String;
begin
  StrPrecoLocal := '';
  Case PrecoPorLitroCasaDecimal of
      0:
          StrPrecoLocal := Format('%8.0f',[PrecoPorLitro / 1]);
      1:
          StrPrecoLocal := Format('%8.1f',[PrecoPorLitro / 10]);
      2:
          StrPrecoLocal := Format('%8.2f',[PrecoPorLitro / 100]);
      3:
          StrPrecoLocal := Format('%8.3f',[PrecoPorLitro / 1000]);
  End;
  Display (AnsiString('Sl=' + IntToStr(Slave) + ' Bo=' + IntToStr(Bomba) + ' Bi=' + IntToStr(Bico) + ' PrecoPorLitro=' + StrPrecoLocal));
end;
//------------------------------------------------------------------------------
procedure TFrmMain.CesnaFcmTotalizador(ASender: TObject; Slave, Bomba,Bico: Byte; Totalizador: Integer; TotalizadorCasaDecimal: Byte);
var
StrTotalLocal:string;
begin
    StrTotalLocal := '';
    Case TotalizadorCasaDecimal of
        0:
            StrTotalLocal := Format('%8.0f',[Totalizador / 1]);
        1:
            StrTotalLocal := Format('%8.1f',[Totalizador / 10]);
        2:
            StrTotalLocal := Format('%8.2f' ,[Totalizador / 100]);
        3:
            StrTotalLocal := Format('%8.3f' ,[Totalizador / 1000]);
    End;

    if(FrmTotais.SolicitacaoAtiva = True)Then                     // Se Solicitação do FormTatis estiver ativa.
    begin
        FlagObtemTotal[Bomba]         := False;                   // 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 (AnsiString('Sl=' + IntToStr(Slave) + ' Bo=' + IntToStr(Bomba) + ' Bi=' + IntToStr(Bico) + ' Totalizador Volume=' + StrTotalLocal));
end;
//------------------------------------------------------------------------------
procedure TFrmMain.CesnaFcmVersaoFcmSlave(ASender: TObject; Slave: Byte;Versao: Integer);
begin
  Display(AnsiString('FcmSlave ' + IntToStr(Slave) + ' - Versão ' + IntToStr(Versao)));
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(AnsiString('Sl=' + IntToStr(Slave) + ' Bo=' + IntToStr(Bomba) + ' Bi=' + IntToStr(Bico) + ' - RETORNO ESPECIAL '));
	Display(AnsiString('CÓDIGO    : ' + IntToStr(CodigoRetorno)));
	Display(AnsiString('Retorno   : ' + IntToStr(Retorno1)));
	Display(AnsiString('Retorno 2 : ' + IntToStr(Retorno2)));
	Display(AnsiString('Retorno 3 : ' + IntToStr(Retorno3)));
end;

//------------------------------------------------------------------------------
end.
