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;
    BtnIniciaCom: TButton;
    BtnSair: TButton;
    BtnVersaoDll: TButton;
    Label1: TLabel;
    Label2: TLabel;
    BtnObtemNumAbastOff: 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;
    BtnObtemStatusBo: TButton;
    CmbBoxNumMab: TComboBox;
    CmbBoxNumBo: TComboBox;
    MEdtPpl: TMaskEdit;
    MEdtPrePago: TMaskEdit;
    CmbBoxMab: TComboBox;
    CmbBoxBomba: TComboBox;
    CmbBoxBico: TComboBox;
    ChbTodas: TCheckBox;
    Cesna: TCesna;
    Label12: TLabel;
    CmbBoxModoOp: TComboBox;
    Label13: TLabel;
    CmbBoxTipoBomba: TComboBox;
    BtnObtemConfig: TButton;
    BtnObtemAbastFlash: TButton;
    procedure FormCreate(Sender: TObject);
    procedure BtnIniciaComClick(Sender: TObject);
    procedure BtnSairClick(Sender: TObject);
    procedure BtnVersaoDllClick(Sender: TObject);
    procedure BtnObtemNumAbastOffClick(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 CesnaRetornoEspecial( ASender: TObject; Slave, Bomba, Bico: Byte;
                                    CodigoRetorno, Retorno1, Retorno2, Retorno3: Integer);
    procedure CesnaIdCodeMudancaDeEstado(ASender: TObject; Mab, Bomba, Bico,
      Estado: Byte);
    procedure BtnObtemConfigClick(Sender: TObject);
    procedure BtnObtemAbastFlashClick(Sender: TObject);
    procedure CesnaIdCodeAbasteceu(ASender: TObject; Mab, Bomba, Bico: Byte;
      Volume: Integer; VolumeCasaDecimal: Byte; TotalInicial: Integer;
      TotalInicialCasaDecimal: Byte; TotalFinal: Integer;
      TotalFinalCasaDecimal: Byte; PrecoPorLitro: Integer;
      PrecoPorLitroCasaDecimal: Byte; Data, Hora: Integer; const TagFrentista,
      TagCliente: WideString; FlagAbastecimentoOff: Byte;
      NumeroAbastecimento: Integer);
    procedure CesnaIdCodePrecoPorLitro(ASender: TObject; Mab, Bomba, Bico: Byte;
      PrecoPorLitro: Integer; PrecoPorLitroCasaDecimal: Byte);
    procedure CesnaIdCodeTotalizador(ASender: TObject; Mab, Bomba, Bico: Byte;
      Totalizador: Integer; TotalizadorCasaDecimal: Byte);
    procedure CesnaIdCodeVolume(ASender: TObject; Mab, Bomba, Bico: Byte;
      Volume: Integer; VolumeCasaDecimal: Byte);
    procedure CesnaIdCodeValorBombaAbast(ASender: TObject; Mab, Bomba,
      Bico: Byte; Valor: Integer; ValorCasaDecimal: Byte);
    procedure CesnaIdCodeRetornoAbatFlash(ASender: TObject; Mab, Bomba,
      Bico: Byte; Volume: Integer; VolumeCasaDecimal: Byte;
      TotalInicial: Integer; TotalInicialCasaDecimal: Byte; TotalFinal: Integer;
      TotalFinalCasaDecimal: Byte; PrecoPorLitro: Integer;
      PrecoPorLitroCasaDecimal: Byte; Data, Hora: Integer; const TagFrentista,
      TagCliente: WideString; FlagAbastecimentoOff: Byte;
      NumeroAbastecimento: Integer);
    procedure CesnaIdCodeNumAbastOff(ASender: TObject; Mab: Byte;
      NumeroAbastecimantosOffline: Integer);
    procedure CesnaIdCodeInfoEvento(ASender: TObject; Mab, Bomba, Bico,
      Evento: Byte);
    procedure CesnaIdCodeConfigMab(ASender: TObject; Mab, NumeroBombas,
      ModoOperacao, TipoBomba: Byte);
    procedure CesnaIdCodeErroCrcTab(ASender: TObject; Mab: Byte; Crc: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure Display(x : AnsiString);// Função imprime dislplay eventos
    function ObtemEnderecos(var EndMab,EndBo,EndBi:Byte):Boolean;

//--- 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
  FlagComunicacaoAtiva:Byte;                        // Indica se a Comunicação está ativa
  end;

var
  FrmMain: TFrmMain;

implementation
uses Ex_ConfereEncerrantes;// Add form encerrantes

{$R *.dfm}
//------------------------------------------------------------------------------
procedure TFrmMain.FormCreate(Sender: TObject);
begin
//--- Inicialização de Objetos
MemDisp.Lines.Clear;
ChBoxAutoriza.Checked         := true;  // Caixa autoriza inicia marcada.
CmbBoxModoOp.ItemIndex        := 0;
CmbBoxTipoBomba.ItemIndex     := 0;
CmbBoxNumMab.ItemIndex        := 0;
CmbBoxNumBo.ItemIndex         := 0;

CmbBoxMab.ItemIndex           := 0;
CmbBoxBomba.ItemIndex         := 0;
CmbBoxBico.ItemIndex          := 0;

//--- Inicialização de Variáveis
FlagComunicacaoAtiva          := 0;
end;
//------------------------------------------------------------------------------
procedure TFrmMain.Display(x : AnsiString);
begin

//  MemDisp.Text := MemDisp.Text + String(x);
//  MemDisp.Lines.add('');
  MemDisp.Lines.add(String(x));
end;
//------------------------------------------------------------------------------
//------------ Group Box Comandos FcmMaster USB --------------------------------
//------------------------------------------------------------------------------
procedure TFrmMain.BtnIniciaComClick(Sender: TObject);
var
StrStartLocal :String;
StrStopLocal  :String;
NumMabLocal   :Byte;
Retorno       :Integer;

begin
  StrStartLocal :=  'Inicia COM';
  StrStopLocal  :=  'Finaliza COM';
  NumMabLocal   :=  0;
  Retorno       :=  0;

  if(BtnIniciaCom.Caption = StrStartLocal)Then
  begin
    NumMabLocal := StrToInt(InputBox('Entre com o Número de MAB(s) para Comunicar','Número de MAB(s). Este parâmetro deve estar entre 1 e 16','0'));
    //--- Filtro de Endereço Mab
    if((NumMabLocal > 16) Or (NumMabLocal < 1))Then
    begin
      ShowMessage('Erro: Número de MAB(s) deve estar entre 1 e 16!');
      Exit;
    end;

    Retorno := Cesna.IdCodeOpen(NumMabLocal);
    if(Retorno <> 1)Then
    begin
      Display(AnsiString('Erro Cmd Open - Retorno: ' + IntToStr(Retorno)));
      Exit;
    end;

    FlagComunicacaoAtiva := 1;
    BtnIniciaCom.Caption := StrStopLocal;
    Display('OPEN DEVICE OK!');
  end
  else
  begin
    Retorno := Cesna.IdCodeClose();
    if(Retorno <> 1)Then
    begin
      Display(AnsiString('Erro Cmd Close - Retorno: ' + IntToStr(Retorno)));
      Exit;
    end;

    FlagComunicacaoAtiva := 0;
    BtnIniciaCom.Caption := StrStartLocal;
    Display('CLOSE DEVICE OK!');
  end;
end;
//------------------------------------------------------------------------------
procedure TFrmMain.BtnSairClick(Sender: TObject);
begin
  if(FlagComunicacaoAtiva = 1)Then
    BtnIniciaCom.Click;

  Close;
end;
//------------------------------------------------------------------------------
procedure TFrmMain.BtnVersaoDllClick(Sender: TObject);
var
  AuxStr :AnsiString;
begin

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

	case (Length(AuxStr))of

    1:
			Display ('Versao IdCode.dll V 000' + AuxStr);
		2:
			Display('Versao IdCode.dll V 00' + AuxStr);
		3:
			Display ('Versao IdCode.dll V 0' + AuxStr);
		4:
			Display ('Versao IdCode.dll V ' + AuxStr);
  end;
end;
//------------------------------------------------------------------------------
function TFrmMain.ObtemEnderecos(var EndMab,EndBo,EndBi:Byte):Boolean;
begin
  if( ((CmbBoxMab.ItemIndex   + 1)  > 16)  Or ((CmbBoxMab.ItemIndex   + 1) < 1) Or
      ((CmbBoxBomba.ItemIndex + 1)  > 16)  Or ((CmbBoxBomba.ItemIndex + 1) < 1) Or
      ((CmbBoxBico.ItemIndex  + 1)  > 16)  Or ((CmbBoxBico.ItemIndex  + 1) < 1) )Then
  begin
    ShowMessage('Erro: Endereços Mab, Bomba ou Bico Fora do Range!');
    Result:= false;
    Exit;
  end;

  EndMab  := CmbBoxMab.ItemIndex    + 1;
  EndBo   := CmbBoxBomba.ItemIndex  + 1;
  EndBi   := CmbBoxBico.ItemIndex   + 1;

  Result:= true;
end;
//------------------------------------------------------------------------------
//------------ Group Box Comandos Concentrador IdCode --------------------------
//------------------------------------------------------------------------------
procedure TFrmMain.BtnObtemConfigClick(Sender: TObject);
var
MabLocal    :Byte;
RetornoLocal:Integer;
begin
  MabLocal := CmbBoxNumMab.ItemIndex + 1;

  RetornoLocal := Cesna.IdCodeObtemConfiguracaoMab(MabLocal);

  if(RetornoLocal <> 1)Then
    Display(AnsiString('Erro Cmd Obtém Configuração! - Retorno' + IntToStr(RetornoLocal)));
end;
//------------------------------------------------------------------------------
procedure TFrmMain.BtnConfiguraClick(Sender: TObject);
var
  MabLocal          :Byte;              // Var que conterá o endereço da MAB para configuração
  NumeroBombasLocal :Byte;              // Var que conterá o número de bombas para configuração
  TipoBombaLocal    :Byte;              // Var que conterá o tipo da Bomba para ser configurada
  ModoOperacaoLocal :Byte;              // Var que conterá o modo de operação
  RetornoLocal      :Integer;           // Conterá o Retorno da Chamada de função para o Componente ActiveX
begin

//--- Obtém Valores para Configuração
MabLocal          := CmbBoxNumMab.ItemIndex     + 1;
NumeroBombasLocal := CmbBoxNumBo.ItemIndex      + 1;
TipoBombaLocal    := CmbBoxTipoBomba.ItemIndex  + 1;
ModoOperacaoLocal := CmbBoxModoOp.ItemIndex     + $0A;

  RetornoLocal  := Cesna.IdCodeConfiguraMab(MabLocal,NumeroBombasLocal,TipoBombaLocal,ModoOperacaoLocal);

  if(RetornoLocal <> 1)Then
    Display(AnsiString('Erro Cmd Configura - Retorno: ' + IntToStr(RetornoLocal)));
end;
//------------------------------------------------------------------------------
procedure TFrmMain.BtnObtemNumAbastOffClick(Sender: TObject);
var
MabLocal    :Byte;
RetornoLocal:Integer;
begin
  MabLocal := CmbBoxNumMab.ItemIndex + 1;

  // A resposta a Este cmd vêm pelo retorno do método "OnIdCodeNumAbastOff"
  RetornoLocal := Cesna.IdCodeObtemNumAbastOff(MabLocal);

  if(RetornoLocal <> 1)Then
    Display(AnsiString('Erro Cmd Obtém Número de Abastecimentos Off-Line! - Retorno' + IntToStr(RetornoLocal)));
end;
//------------------------------------------------------------------------------
procedure TFrmMain.BtnObtemAbastFlashClick(Sender: TObject);
var
MabLocal            :Byte;
NumeroAbastecimento :Integer;
RetornoLocal        :Integer;
begin

  MabLocal := CmbBoxNumMab.ItemIndex + 1;
  NumeroAbastecimento := StrToInt(InputBox('Entre com o Número Do Abastecimento','Número do Abastecimanto:','0'));

  if(NumeroAbastecimento > 299)Then
  begin
    ShowMessage('Número do Abastecimento Fora do Range');
    Exit;
  end;

  // A resposta a Este cmd vêm pelo retorno do método "OnIdCodeRetornoAbastFlash"
  RetornoLocal := Cesna.IdCodeObtemAbastFlash(MabLocal,NumeroAbastecimento);

  if(RetornoLocal <> 1)Then
    Display(AnsiString('Erro Cmd Obtém Abastecimento Flash! - Retorno' + IntToStr(RetornoLocal)));
end;
//------------------------------------------------------------------------------
//------------ Group Box Comandos Bombas ---------------------------------------
//------------------------------------------------------------------------------
procedure TFrmMain.BtnAutorizaClick(Sender: TObject);
var
MabLocal      :Byte;    // Conterá o endereço da Mab do ComboBox "CmbBoxMab";
BombaLocal    :Byte;    // Conterá o endereço da Bomba do ComboBox "CmbBoxBomba";
BicoLocal     :Byte;    // Conterá o endereço da Bico do ComboBox "CmbBoxBico";
RetornoLocal  :Integer; // Conterá o Retorno da Chamada de função para o Componente ActiveX
begin

  //--- Obtem endereços
  if(ObtemEnderecos(MabLocal,BombaLocal,BicoLocal) = false)Then
    Exit;

  // A Confirmação deste cmd vêm pelo retorno do método "OnIdCodeMudancaDeEstado" em "BOMBA_LIBERADA"
  // autoriza a bomba para iniciar abastecimento
  // Se MAB estiver em modo 'C', este Cmd será recusado
  RetornoLocal := Cesna.IdCodeAutorizaAbastecimento(MabLocal,BombaLocal,BicoLocal);

  if(RetornoLocal <> 1)Then
    Display(AnsiString('Erro Cmd Autoriza Abastecimento - Retorno' + IntToStr(RetornoLocal)));
end;
//------------------------------------------------------------------------------
procedure TFrmMain.BtnTravaClick(Sender: TObject);
var
MabLocal      :Byte;    // Conterá o endereço da Mab do ComboBox "CmbBoxMab";
BombaLocal    :Byte;    // Conterá o endereço da Bomba do ComboBox "CmbBoxBomba";
BicoLocal     :Byte;    // Conterá o endereço da Bico do ComboBox "CmbBoxBico";
RetornoLocal  :Integer; // Conterá o Retorno da Chamada de função para o Componente ActiveX
begin

  //--- Obtem endereços
  if(ObtemEnderecos(MabLocal,BombaLocal,BicoLocal) = false)Then
    Exit;

  // A Confirmação deste cmd vêm pelo retorno do método "OnIdCodeMudancaDeEstado" em "BOMBA_BLOQUEADA"
  RetornoLocal := Cesna.IdCodeTravaBomba(MabLocal,BombaLocal,BicoLocal);

  if(RetornoLocal <> 1)Then
    Display(AnsiString('Erro Cmd Trava Bomba - Retorno' + IntToStr(RetornoLocal)));
end;
//------------------------------------------------------------------------------
procedure TFrmMain.BtnDestravaClick(Sender: TObject);
var
MabLocal      :Byte;    // Conterá o endereço da Mab do ComboBox "CmbBoxMab";
BombaLocal    :Byte;    // Conterá o endereço da Bomba do ComboBox "CmbBoxBomba";
BicoLocal     :Byte;    // Conterá o endereço da Bico do ComboBox "CmbBoxBico";
RetornoLocal  :Integer; // Conterá o Retorno da Chamada de função para o Componente ActiveX
begin

  //--- Obtem endereços
  if(ObtemEnderecos(MabLocal,BombaLocal,BicoLocal) = false)Then
    Exit;

  // A Confirmação deste cmd vêm pelo retorno do método "OnIdCodeMudancaDeEstado" em "BOMBA_DESBLOQUEADA"
  RetornoLocal := Cesna.IdCodeDestravaBomba(MabLocal,BombaLocal,BicoLocal);

  if(RetornoLocal <> 1)Then
    Display(AnsiString('Erro Cmd Destrava Bomba - Retorno' + IntToStr(RetornoLocal)));
end;
//------------------------------------------------------------------------------
procedure TFrmMain.BtnUltVolClick(Sender: TObject);
var
MabLocal      :Byte;    // Conterá o endereço da Mab do ComboBox "CmbBoxMab";
BombaLocal    :Byte;    // Conterá o endereço da Bomba do ComboBox "CmbBoxBomba";
BicoLocal     :Byte;    // Conterá o endereço da Bico do ComboBox "CmbBoxBico";
RetornoLocal  :Integer; // Conterá o Retorno da Chamada de função para o Componente ActiveX
begin

  //--- Obtem endereços
  if(ObtemEnderecos(MabLocal,BombaLocal,BicoLocal) = false)Then
    Exit;

  // A Confirmação deste cmd vêm pelo retorno do método "OnIdCodeVolume"
  RetornoLocal := Cesna.IdCodeObtemUltimoVolume(MabLocal,BombaLocal,BicoLocal);

  if(RetornoLocal <> 1)Then
    Display(AnsiString('Erro Cmd Obtém Último Volume - Retorno' + IntToStr(RetornoLocal)));
end;
//------------------------------------------------------------------------------
procedure TFrmMain.BtnObtemPplClick(Sender: TObject);
var
MabLocal      :Byte;    // Conterá o endereço da Mab do ComboBox "CmbBoxMab";
BombaLocal    :Byte;    // Conterá o endereço da Bomba do ComboBox "CmbBoxBomba";
BicoLocal     :Byte;    // Conterá o endereço da Bico do ComboBox "CmbBoxBico";
RetornoLocal  :Integer; // Conterá o Retorno da Chamada de função para o Componente ActiveX
begin

  //--- Obtem endereços
  if(ObtemEnderecos(MabLocal,BombaLocal,BicoLocal) = false)Then
    Exit;

  // A Confirmação deste cmd vêm pelo retorno do método "OnIdCodePrecoPorLitro"
  RetornoLocal := Cesna.IdCodeObtemPrecoPorLitro(MabLocal,BombaLocal,BicoLocal);

  if(RetornoLocal <> 1)Then
    Display(AnsiString('Erro Cmd Obtém Preço por Litro - Retorno' + IntToStr(RetornoLocal)));
end;
//------------------------------------------------------------------------------
procedure TFrmMain.BtnTotClick(Sender: TObject);
var
MabLocal      :Byte;    // Conterá o endereço da Mab do ComboBox "CmbBoxMab";
BombaLocal    :Byte;    // Conterá o endereço da Bomba do ComboBox "CmbBoxBomba";
BicoLocal     :Byte;    // Conterá o endereço da Bico do ComboBox "CmbBoxBico";
RetornoLocal  :Integer; // Conterá o Retorno da Chamada de função para o Componente ActiveX
begin

  //--- Obtem endereços
  if(ObtemEnderecos(MabLocal,BombaLocal,BicoLocal) = false)Then
    Exit;

  // A Confirmação deste cmd vêm pelo retorno do método "OnIdCodeTotalizador"
  RetornoLocal := Cesna.IdCodeObtemTotalizador(MabLocal,BombaLocal,BicoLocal);

  if(RetornoLocal <> 1)Then
    Display(AnsiString('Erro Cmd Obtém Totalizador - Retorno' + IntToStr(RetornoLocal)));
end;
//------------------------------------------------------------------------------
procedure TFrmMain.BtnTrocaPplClick(Sender: TObject);
var
MabLocal              :Byte;    // Conterá o endereço da Mab do ComboBox "CmbBoxMab";
BombaLocal            :Byte;    // Conterá o endereço da Bomba do ComboBox "CmbBoxBomba";
BicoLocal             :Byte;    // Conterá o endereço da Bico do ComboBox "CmbBoxBico";
RetornoLocal          :Integer; // Conterá o Retorno da Chamada de função para o Componente ActiveX

PrecoLocal            :Integer; // Conterá o Preço à ser trocado na bomba
PrecoCasaDecimalLocal :Byte;    // Conterá a Casa decimal do Preço

begin

  //--- Obtem endereços
  if(ObtemEnderecos(MabLocal,BombaLocal,BicoLocal) = false)Then
    Exit;

  //Obtém o Preço para trocar
  PrecoLocal            := trunc(StrToFloat(MEdtPpl.Text)*1000);
  PrecoCasaDecimalLocal := 3;                                                   // Valor Fixo


  // A Confirmação deste cmd vêm pelo retorno do método "OnIdCodeMudancaDeEstado" em "BOMBA_TROCOU_PRECO"
  RetornoLocal := Cesna.IdCodeTrocaPrecoPorLitro(MabLocal,BombaLocal,BicoLocal,PrecoLocal,PrecoCasaDecimalLocal);

  if(RetornoLocal <> 1)Then
    Display(AnsiString('Erro Cmd Troca Preço por Litro - Retorno' + IntToStr(RetornoLocal)));
end;
//------------------------------------------------------------------------------
procedure TFrmMain.BtnPrePagoClick(Sender: TObject);
var
MabLocal              :Byte;    // Conterá o endereço da Mab do ComboBox "CmbBoxMab";
BombaLocal            :Byte;    // Conterá o endereço da Bomba do ComboBox "CmbBoxBomba";
BicoLocal             :Byte;    // Conterá o endereço da Bico do ComboBox "CmbBoxBico";
RetornoLocal          :Integer; // Conterá o Retorno da Chamada de função para o Componente ActiveX

VolumeLocal            :Integer; // Conterá o Volume para Pré-Set na bomba
VolumeCasaDecimalLocal :Byte;    // Conterá a Casa decimal do Volume
begin

  //--- Obtem endereços
  if(ObtemEnderecos(MabLocal,BombaLocal,BicoLocal) = false)Then
    Exit;

  //Obtém o Preço para trocar
  VolumeLocal            := trunc(StrToFloat(MEdtPrePago.Text)*1000);
  VolumeCasaDecimalLocal := 3;                                                   // Valor Fixo

  // A Confirmação deste cmd vêm pelo retorno do método "OnIdCodeMudancaDeEstado" em "BOMBA_RESERVADA_PREPAGO"
  RetornoLocal := Cesna.IdCodeTrocaPrecoPorLitro(MabLocal,BombaLocal,BicoLocal,VolumeLocal,VolumeCasaDecimalLocal);

  if(RetornoLocal <> 1)Then
    Display(AnsiString('Erro Cmd Seta Abastecimento Pré-Pago - Retorno' + IntToStr(RetornoLocal)));
end;
//------------------------------------------------------------------------------
procedure TFrmMain.BtnObtemStatusBoClick(Sender: TObject);
var
MabLocal      :Byte;    // Conterá o endereço da Mab do ComboBox "CmbBoxMab";
BombaLocal    :Byte;    // Conterá o endereço da Bomba do ComboBox "CmbBoxBomba";
BicoLocal     :Byte;    // Conterá o endereço da Bico do ComboBox "CmbBoxBico";
RetornoLocal  :Integer; // Conterá o Retorno da Chamada de função para o Componente ActiveX
begin

  //--- Obtem endereços
  if(ObtemEnderecos(MabLocal,BombaLocal,BicoLocal) = false)Then
    Exit;

  // Atenção: Se o parâmetro Bomba for mandado como zero, Mab IdCode enviará
  // o Status de Todas as Bombas a ela conectadas
  //Obs.: Somente nesta função o parâmetro bo pode ser zero.
  if ChbTodas.Checked = TRUE then
    BombaLocal := 0;

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

  if(RetornoLocal <> 1)Then
    Display(AnsiString('Erro Cmd Obtém Status Bomba(s) - Retorno' + IntToStr(RetornoLocal)));
end;
//------------------------------------------------------------------------------
procedure TFrmMain.ObtemEncerrantes1Click(Sender: TObject);
begin
  FrmTotais.Show;
end;
//------------------------------------------------------------------------------
//******************* Retornos dos Métodos CesnaActiveX ------------------------
//------------------------------------------------------------------------------
procedure TFrmMain.CesnaIdCodeAbasteceu(ASender: TObject; Mab, Bomba,
  Bico: Byte; Volume: Integer; VolumeCasaDecimal: Byte; TotalInicial: Integer;
  TotalInicialCasaDecimal: Byte; TotalFinal: Integer;
  TotalFinalCasaDecimal: Byte; PrecoPorLitro: Integer;
  PrecoPorLitroCasaDecimal: Byte; Data, Hora: Integer; const TagFrentista,
  TagCliente: WideString; FlagAbastecimentoOff: Byte;
  NumeroAbastecimento: Integer);
var
StrVolumeLocal        :String;
StrTotalLocal         :String;
StrTotalIniLocal      :String;
StrPrecoLocal         :String;
StrDataLocal          :String;
StrHorarioLocal       :String;
StrTagFrentistaLocal  :String;
StrTagClienteLocal    :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('Mab=' + IntToStr(Mab) + ' Bo=' + IntToStr(Bomba) + ' Bi=' + IntToStr(Bico) + ' Informou Dados'));
    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]));

    StrTagFrentistaLocal  := String(TagFrentista);
    Display (AnsiString('Cartão Frentista ='   + StrTagFrentistaLocal));
    StrTagClienteLocal    := String(TagCliente);
    Display (AnsiString('Cartão Cliente ='   + StrTagClienteLocal));
    Display (AnsiString('Némero Abastecimento Flash: ' + IntToStr(NumeroAbastecimento)));
    if(FlagAbastecimentoOff = 1)Then
    begin
      Display('Abastecimento Off - Line');
    end
    else
      Display('Abastecimento On - Line');
end;
//------------------------------------------------------------------------------
procedure TFrmMain.CesnaIdCodeMudancaDeEstado(ASender: TObject; Mab, 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('Mab=' + IntToStr(Mab) + ' 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.IdCodeAutorizaAbastecimento(Mab,Bomba,Bico) <> 1) Then
          Display (AnsiString('Mab=' + IntToStr(Mab) + ' Bo=' + IntToStr(Bomba) + ' Bi=' + IntToStr(Bico)+ ' - Erro - Cmd Autoriza Abastecimento'));
  end;
end;
//------------------------------------------------------------------------------
procedure TFrmMain.CesnaIdCodePrecoPorLitro(ASender: TObject; Mab, 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('Mab=' + IntToStr(Mab) + ' Bo=' + IntToStr(Bomba) + ' Bi=' + IntToStr(Bico) + ' PrecoPorLitro=' + StrPrecoLocal));
end;
//------------------------------------------------------------------------------
procedure TFrmMain.CesnaIdCodeTotalizador(ASender: TObject; Mab, 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[Mab][Bomba][Bico] := Totalizador;             // Armazena totalizador
        RespCdTot[Mab][Bomba][Bico] := TotalizadorCasaDecimal;  // Armazena CD Totalizador
    end;

    Display (AnsiString('Mab=' + IntToStr(Mab) + ' Bo=' + IntToStr(Bomba) + ' Bi=' + IntToStr(Bico) + ' Totalizador Volume=' + StrTotalLocal));
end;
//------------------------------------------------------------------------------
procedure TFrmMain.CesnaIdCodeVolume(ASender: TObject; Mab, 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('Mab=' + IntToStr(Mab) + ' Bo=' + IntToStr(Bomba) + ' Bi=' + IntToStr(Bico) + ' Volume =' + StrVolumeLocal));
end;
//------------------------------------------------------------------------------
procedure TFrmMain.CesnaIdCodeValorBombaAbast(ASender: TObject; Mab, Bomba,
  Bico: Byte; Valor: Integer; ValorCasaDecimal: Byte);
var
StrValorLocal :String;
begin

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

  Display (AnsiString('Mab=' + IntToStr(Mab) + ' Bo=' + IntToStr(Bomba) + ' Bi=' + IntToStr(Bico) + ' Valor Parcial = R$' + StrValorLocal));
end;
//------------------------------------------------------------------------------
procedure TFrmMain.CesnaIdCodeRetornoAbatFlash(ASender: TObject; Mab, Bomba,
  Bico: Byte; Volume: Integer; VolumeCasaDecimal: Byte; TotalInicial: Integer;
  TotalInicialCasaDecimal: Byte; TotalFinal: Integer;
  TotalFinalCasaDecimal: Byte; PrecoPorLitro: Integer;
  PrecoPorLitroCasaDecimal: Byte; Data, Hora: Integer; const TagFrentista,
  TagCliente: WideString; FlagAbastecimentoOff: Byte;
  NumeroAbastecimento: Integer);
var
StrVolumeLocal        :String;
StrTotalLocal         :String;
StrTotalIniLocal      :String;
StrPrecoLocal         :String;
StrDataLocal          :String;
StrHorarioLocal       :String;
StrTagFrentistaLocal  :String;
StrTagClienteLocal    :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('Mab=' + IntToStr(Mab) + ' Bo=' + IntToStr(Bomba) + ' Bi=' + IntToStr(Bico) + ' Obteve Abastecimento Memória Flash'));
    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]));

    StrTagFrentistaLocal  := String(TagFrentista);
    Display (AnsiString('Cartão Frentista ='   + StrTagFrentistaLocal));
    StrTagClienteLocal    := String(TagCliente);
    Display (AnsiString('Cartão Cliente ='   + StrTagClienteLocal));
    Display (AnsiString('Némero Abastecimento Flash: ' + IntToStr(NumeroAbastecimento)));
    if(FlagAbastecimentoOff = 1)Then
    begin
      Display('Abastecimento Off - Line');
    end
    else
      Display('Abastecimento On - Line');

end;
//------------------------------------------------------------------------------
procedure TFrmMain.CesnaIdCodeNumAbastOff(ASender: TObject; Mab: Byte;
  NumeroAbastecimantosOffline: Integer);
begin
  Display(AnsiString('Mab: ' + IntToStr(Mab) + ' - Informou Número de Abastecimentos Off-Line: ' + IntToStr(NumeroAbastecimantosOffline)));
end;
//------------------------------------------------------------------------------
procedure TFrmMain.CesnaIdCodeInfoEvento(ASender: TObject; Mab, Bomba, Bico,
  Evento: Byte);
begin
 	// Esta função é utilizada pelo suporte da Cesna, não sendo necessário sua utilização.
	Display (AnsiString('Mab=' + IntToStr(Mab) + ' 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.CesnaIdCodeConfigMab(ASender: TObject; Mab, NumeroBombas,
  ModoOperacao, TipoBomba: Byte);
begin
  Display(AnsiString('Mab: ' + IntToStr(Mab) + ' - Informou Configuração'));
  Display(AnsiString('Número de Bombas: ' + IntToStr(NumeroBombas)));
  Display(AnsiString('Modo Operação: '    + IntToStr(ModoOperacao)));
  Display(AnsiString('Tipo de Bomba: '    + IntToStr(TipoBomba)));
end;
//------------------------------------------------------------------------------
procedure TFrmMain.CesnaIdCodeErroCrcTab(ASender: TObject; Mab: Byte;
  Crc: Integer);
begin
  Display(AnsiString('Mab: ' + IntToStr(Mab) + ' - Informou Erro CRC: ' + IntToHex(Crc,2)));
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('Mab=' + 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.
