unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    Edit2: TEdit;
    Label2: TLabel;
    Edit3: TEdit;
    Label3: TLabel;
    Button2: TButton;
    Edit4: TEdit;
    procedure Button1Click(Sender: TObject);
    function TrataRetLogger(VLRet: Integer): String;
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }

inicio, fim, retorno: Integer;
ret, retorno_txt: string;

  end;

function  DLLG2_IniciaDriver(Canal: String): Integer; stdcall; external 'DllG2.dll';
function  DLLG2_EncerraDriver(Handle: Integer): Integer; stdcall; external 'DllG2.dll';

function  DLLG2_ExecutaComando(Handle: Integer; Comando: string): Integer; stdcall; external 'DllG2.dll';

function  DLLG2_LeRegistrador(Handle: Integer; NomeRegistrador : String; NomeComando: string; TamNomeComando: Integer): Integer; stdcall; external 'DllG2.dll';

function DLLG2_ObtemNomeErro(Handle: Integer; NomeErro: String; TamNomeErro: integer): String; stdcall; external 'DllG2.dll';
function DLLG2_ObtemCodErro(Handle: Integer): Integer; stdcall; external 'DllG2.dll';

function DLLG2_ObtemCircunstancia(Handle: Integer; Circunstancia: String; TamNomeCircunstancia: Integer): String; stdcall; external 'DllG2.dll';

function DLLG2_ObtemRetornos(Handle: Integer; Retornos: String; TamRetorno: Integer): String; stdcall; external 'DllG2.dll';
function DLLG2_Retorno(Handle: Integer; Indice : Integer; NomeRetorno: string; TamNomeRetorno: Integer; ValorRetorno: string; TamValorRetorno: Integer): Integer; stdcall; external 'DllG2.dll';

procedure DLLG2_LimpaParams(Handle: Integer); stdcall; external 'DllG2.dll';
procedure DLLG2_AdicionaParam(Handle: Integer; NomeParam, ValorParam: string; TipoParam: Integer);stdcall; external 'DllG2.dll'; // 0-boolean  2-data  3-hora  4-inteiro  5-long  9-inteiro sem sinal  10-long sem sinal 6-Monetario  7-string
procedure DLLG2_DefineTimeout(Handle: Integer; TempoMaximo: Integer) stdcall; external 'DllG2.dll';
procedure DLLG2_SetaArquivoLog(NomeArquivo: String)stdcall; external 'DllG2.dll';


var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var
  ECF: string;
  ValorECF: string;
  Vlrecf: integer;
  tam: integer;
begin
  DLLG2_LimpaParams(0);
  DLLG2_AdicionaParam (0, 'NomeTexto', '', 7);
  DLLG2_ExecutaComando(0, 'LeTexto');
  Vlrecf := DLLG2_LeRegistrador(0, 'NumeroSerieECF', 'Valorecf', Length(Valorecf));

  if DLLG2_ExecutaComando(0, 'LeTexto') > 0 then
    begin
      ECF := 'LeTexto';
      Ret := '                                                  ';
      If DLLG2_Retorno(0, 1, ECF, 0, Ret, 50) > 0 Then
         begin
            edit1.Text := Ret
         End;
      Retorno := DLLG2_ObtemCodErro(0);
    end
  else
    begin
      Retorno := DLLG2_ObtemCodErro(0);
      messagedlg(TrataRetLogger(Retorno), mtError, [mbok], 0);
    end;
  // retorno do comando
  edit3.Text := IntToStr(Retorno);
  tam := Length(ret);
  edit2.Text := inttostr(tam);


  end;

function TForm1.TrataRetLogger(VLRet: Integer): String;
begin
  case VLRet of
    0	  : Result := 'Retorno OK.';
    1	  : Result := 'Não foi possível alocar mais memória.';
    2	  : Result := 'Memória RAM foi corrompida.';
    1000  : Result := 'Memória Fiscal foi desconectada.';
    1001  : Result := 'Erro de leitura na Memória Fiscal.';
    1002  : Result := 'Memória está setada apenas para leitura.';
    1003  : Result := 'Registro fora dos padrões (erro interno).';
    1004  : Result := 'Memória Fiscal está lotada.';
    1005  : Result := 'Número máximo de cartuchos excedidos.';
    1006  : Result := 'Tentativa de gravar novo modelo de ECF.';
    1007  : Result := 'Tentativa de gravação de qualquer dado antes da inicialização da Memória Fiscal.';
    1008  : Result := 'Número máximo de usuários foi atingido.';
    1009  : Result := 'Número máximo de intervenções foi atingido.';
    1010  : Result := 'Número máximo de versões foi atingido.';
    1011  : Result := 'Número máximo de reduções foi atingido.';
    1012  : Result := 'Erro na gravação de registro na memória fiscal.';
    2000  : Result := 'Erro de leitura no dispositivo físico.';
    2001  : Result := 'Erro de leitura no dispositivo.';
    2002  : Result := 'Dispositivo de transações foi desconectado.';
    3000  : Result := 'Tipo de registro a ser gravado inválido.';
    3001  : Result := 'Registro de transações está esgotado.';
    3002  : Result := 'Tentativa de abrir nova transação com transação já aberta.';
    3003  : Result := 'Tentativa de fechar uma transação que não se encontrava.';
    4000  : Result := 'Erro de leitura no dispositivo físico.';
    4001  : Result := 'Erro de escrita no dispositivo.';
    4002  : Result := 'Dispositivo de contexto foi desconectado.';
    4003  : Result := 'Leitura após final do arquivo.';
    4004  : Result := 'Escrita após final do arquivo.';
    5000  : Result := 'Versão de contexto fiscal no dispositivo não foi reconhecida.';
    5001  : Result := 'CRC do dispositivo está incorreto.';
    5002  : Result := 'Tentativa de escrita fora da área de contexto.';
    6000  : Result := 'Relógio do ECF inconsistente.';
    6001  : Result := 'Data/hora informadas não estão consistentes.';
    7000  : Result := 'Nenhum mecanismo de impressão presente.';
    7001  : Result := 'Atual mecanismo de impressão está desconectado.';
    7002  : Result := 'Mecanismo não possui capacidade suficiente para realizar esta operação.';
    7003  : Result := 'Impressora está sem papel para imprimir.';
    7004  : Result := 'Faltou papel durante a impressão do comando.';
    8000  : Result := 'Comando fora de seqüência.';
    8001  : Result := 'Código mercadoria não válido.';
    8002  : Result := 'Descrição inválida.';
    8003  : Result := 'Quantidade inválida.';
    8004  : Result := 'Índice da alíquota não válido.';
    8005  : Result := 'Alíquota não carregada.';
    8006  : Result := 'Valor contém caracter inválido.';
    8007  : Result := 'Total da operação igual a 0 (zero).';
    8008  : Result := 'Alíquota não disponível para carga.';
    8009  : Result := 'Valor da alíquota não válido.';
    8010  : Result := 'Troca de situação tributária somente após Redução Z.';
    8011  : Result := 'Índice do Meio de Pagamento não válido.';
    8012  : Result := 'Meio de Pagamento indisponível para carga.';
    8013  : Result := 'Cupom totalizado em 0 (zero).';
    8014  : Result := 'Meio de Pagamento não definido.';
    8015  : Result := 'Carga de usuário permitido somente após Redução Z.';
    8016  : Result := 'Dia sem movimento.';
    8017  : Result := 'Total pago inferior ao total do cupom.';
    8018  : Result := 'Gerencial não definido.';
    8019  : Result := 'Índice do Gerencial fora da faixa.';
    8020  : Result := 'Gerencial não disponível para carga.';
    8021  : Result := 'Nome do Gerencial inválido.';
    8022  : Result := 'Esgotado número de Gerenciais.';
    8023  : Result := 'Acerto do horário de verão somente após a Redução Z.';
    8024  : Result := 'Já acertou horário de verão.';
    8025  : Result := 'Sem Alíquotas disponíveis para carga.';
    8026  : Result := 'Item não vendido no cupom.';
    8027  : Result := 'Quantidade a ser cancelada maior do que a quantidade vendida.';
    8028  : Result := 'Cabeçalho possui campo(s) inválido(s).';
    8029  : Result := 'Nome do Departamento não válido.';
    8030  : Result := 'Departamento não encontrado.';
    8031  : Result := 'Departamento não definido.';
    8032  : Result := 'Não há Meio de Pagamento disponível.';
    8033  : Result := 'Alteração de Meio de Pagamento somente após a Redução Z.';
    8034  : Result := 'Nome do Documento Não Fiscal não pode ser vazio.';
    8035  : Result := 'Não há mais Documentos Não Fiscais disponíveis.';
    8036  : Result := 'Documento Não Fiscal indisponível para carga.';
    8037  : Result := 'Número da redução inicial inválida.';
    8038  : Result := 'Cabeçalho do documento já foi impresso.';
    8039  : Result := 'Número máximo de linhas de propaganda excedidas.';
    8040  : Result := 'Relógio já está no estado desejado.';
    8041  : Result := 'Valor do acréscimo inconsistente.';
    8042  : Result := 'Não há meio de pagamento definido.';
    8043  : Result := 'COO do documento vinculado inválido.';
    8044  : Result := 'Índice do item inexistente no contexto.';
    8045  : Result := 'Código de item não encontrado no cupom atual.';
    8046  : Result := 'Percentual do desconto ultrapassou 100%.';
    8047  : Result := 'Desconto do item inválido.';
    8048  : Result := 'Falta definir valor percentual ou absoluto em operação de desconto/acréscimo.';
    8049  : Result := 'Tentativa de operação sobre item cancelado.';
    8050  : Result := 'Cancelamento de acréscimo/desconto inválidos.';
    8051  : Result := 'Operação de acréscimo/desconto inválida.';
    8052  : Result := 'Número de Departamentos esgotados.';
    8053  : Result := 'Índice de Documento Não Fiscal fora da faixa.';
    8054  : Result := 'Troca de Documento Não Fiscal somente após a Redução Z.';
    8055  : Result := 'CNPJ e/ou Inscrição Estadual inválida(s).';
    8056  : Result := 'Falta(m) parâmetro(s) no comando de abertura de Comprovante Crédito ou Débito.';
    8057  : Result := 'Código e Nome do Documento Não Fiscal indefinidos.';
    8058  : Result := 'Alíquota não definida no comando de venda.';
    8059  : Result := 'Código e Nome do Meio de Pagamento não definidos.';
    8060  : Result := 'Parâmetro de comando não informado.';
    8061  : Result := 'Não há Documentos Não Fiscais definidos.';
    8062  : Result := 'Acréscimo/Desconto de item já cancelado.';
    8063  : Result := 'Não há acréscimo/desconto em item.';
    8064  : Result := 'Item já possui acréscimo.';
    8065  : Result := 'Operação de acréscimo em item ou subtotal só é valido para ICMS.';
    8066  : Result := 'Valor do Comprovante Crédito ou Débito não informado.';
    8067  : Result := 'COO inválido.';
    8068  : Result := 'Índice do Meio de Pagamento no cupom inválido.';
    8069  : Result := 'Documento Não Fiscal não encontrado.';
    8070  : Result := 'Seqüência de pagamento não encontrada no cupom.';
    8071  : Result := 'Meio de pagamento não permite CDC.';
    8072  : Result := 'Valor insuficiente para pagar o cupom.';
    8073  : Result := 'Meio de pagamento origem ou destino não encontrado no último cupom emitido.';
    8074  : Result := 'Valor do estorno não pode exceder o valor do pagamento no meio origem.';
    8075  : Result := 'Meios de pagamento origem e destino devem ser diferentes no estorno.';
    8076  : Result := 'Percentual da alíquota inválido.';
    8077  : Result := 'Não houve operação em subtotal para ser cancelada.';
    8078  : Result := 'Só é permitida uma operação de acréscimo em subtotal por cupom.';
    8079  : Result := 'Texto adicional do meio de pagamento deve ter no máximo 2 linhas.';
    8080  : Result := 'Preço unitário ultrapassou o número máximo de dígitos permitido.';
    8081  : Result := 'Código do departamento fora da faixa.';
    8082  : Result := 'O valor do desconto não pode zerar o valo do cupom ou ser maior que o item.';
    8083  : Result := 'Percentual de acréscimo não pode ser superior a 999,99%.';
    8084  : Result := 'Valor do acréscimo ultrapassa o número máximo de dígitos permitido (13 dígitos).';
    8085  : Result := 'Cupom sem venda em alíquota de ICMS.';
    8086  : Result := 'Cancelamento inválido.';
    8087  : Result := 'Texto de cliche do usuário deve ter no máximo três linhas.';
    8088  : Result := 'Não houve venda de item não fiscal.';
    8089  : Result := 'A data não pode ser inferior a data do último documento emitido.';
    8090  : Result := 'A hora informada no comando não pode ser inferior ao horário do último documento.';
    8091  : Result := 'Sem função.';
    8092  : Result := 'Estado inválido para ajuste de relogio ou horário de verão.';
    8093  : Result := 'A operação de CDC deve preceder as operações de estorno de meio de pagamento.';
    8094  : Result := 'Senha inválida para inicialização do proprietário.';
    8095  : Result := 'Erro gerado pelo mecanismo de cheques.';
    8096  : Result := 'Comando válido somente após a abertura do dia.';
    9000  : Result := 'Não foi encontrado nenhum cartucho de dados vazio para ser inicializado.';
    9001  : Result := 'Cartucho com o número de série informado não foi encontrado.';
    9002  : Result := 'Número de série do ECF é inválido na inicialização.';
    9003  : Result := 'Cartucho de MFD desconectado ou com problemas.';
    9004  : Result := 'Erro de escrita no dispositivo de MFD.';
    9005  : Result := 'Erro na tentativa de posicionar ponteiro de leitura.';
    9006  : Result := 'Endereço do Bad Sector informado é inválido.';
    9007  : Result := 'Erro de leitura na MFD.';
    9008  : Result := 'Tentativa de leitura além dos limites da MFD.';
    9009  : Result := 'MFD não possui mais espaço para escrita.';
    9010  : Result := 'Leitura da MFD serial é interrompida por comando diferente de LeImpressão.';
    10000 : Result := 'Estado inválido para registro sendo codificado.';
    10001 : Result := 'Inconsistência nos parâmetros lidos no Logger.';
    10002 : Result := 'Registro inválido detectado no Logger.';
    10003 : Result := 'Erro interno.';
    11000 : Result := 'Parâmetro repassado ao comando é inválido.';
    11001 : Result := 'Erro de sintaxe na lista de parâmetros.';
    11002 : Result := 'Valor inválido para parâmetro do comando.';
    11003 : Result := 'String contém seqüência de caracteres inválidos.';
    11004 : Result := 'Parâmetro foi declarado 2 ou mais vezes na lista.';
    11005 : Result := 'Parâmetro obrigatório ausente na lista.';
    11006 : Result := 'Não existe o comando no protocolo.';
    11007 : Result := 'Estado atual não permite a execução deste comando.';
    11008 : Result := 'Sinalização indicando que comando aborta a impressão da segunda via.';
    11009 : Result := 'Sinalização indicando que comando não possui retorno.';
    11010 : Result := 'Tempo de execução esgotado.';
    11011 : Result := 'Nome de registrador inválido.';
    11012 : Result := 'Tipo de registrador inválido.';
    11013 : Result := 'Tentativa de escrita em registrador de apenas leitura.';
    11014 : Result := 'Tentativa de leitura em registrador de apenas escrita.';
    11015 : Result := 'Comando recebido diferente do anterior no buffer de recepção.';
    11016 : Result := 'Fila de comandos cheia.';
    11017 : Result := 'Índice de registrador indexado fora dos limites.';
    11018 : Result := 'Número de emissões do Logger foi excedido na Intervenção Técnica.';
    11019 : Result := 'Divisão por 0 (zero) nas rotinas de BDC.';
    15001 : Result := 'Comando aceito apenas em modo de Intervencao Técnica.';
    15002 : Result := 'Comando não pode ser executado em modo de Intervenção Técnica.';
    15003 : Result := 'Já existe MFD presente neste ECF.';
    15004 : Result := 'Não existe MFD neste ECF.';
    15005 : Result := 'Memória RAM do ECF não está consistente.';
    15006 : Result := 'Memória fiscal não encontrada.';
    15007 : Result := 'Dia já Fechado.';
    15008 : Result := 'Dia aberto.' ;
    15009 : Result := 'Falta reducao Z.';
    15010 : Result := 'Mecanismo impressor não selecionado.';
    15011 : Result := 'Sem bobina de papel na estação de documento fiscal.';
    15012 : Result := 'Tentativa de finalizar documento já encerrado.';
    15013 : Result := 'Não há sinal de DTR.';
    15014 : Result := 'Sem inscrições do usuário no ECF.';
    15015 : Result := 'Sem dados do proprietário no ECF.';
    15016 : Result := 'ECF encontra-se indevidamente em linha.';
    15017 : Result := 'ECF não encontra-se em linha para executar o comando.';
  end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
begin
  inicio := DLLG2_IniciaDriver(edit4.text);
  DLLG2_DefineTimeout(0, 20);
  DLLG2_SetaArquivoLog('log.txt');
  if inicio < 0 then
    showmessage('não foi possivel conectar na porta' + ' ' + edit1.Text)
  else
    begin
    edit3.Text := 'Conectado';
    end;
end;
end;

end.
