Ir para conteúdo
  • Cadastre-se

dev botao

Erro ao enviar a imagem QRCode para o PIN PAD utilizando o componente ACBrAbecsPinPad


Recommended Posts

  • Membros Pro

Estou utilizando o componente ACBrAbecsPinPad para enviar a imagem do QRCode para o PIN PAD. Notei que esse erro ocorre aleatoriamente, em alguns momentos funciona o envio da imagem sem erros e em outras causas o erro aparece. 

O erro ocorre quando aciono o comando "ACBrAbecsPinPad1.DSI" para enviar imagem ao PIN PAD. Para simular o erro segui os seguintes passos utilizando o aplicativo demo PinPadTest.

- Abrir o aplicativo e clicar no botão "Activate"

- Ir na aba Multimedia e clicar no botão "Send To PinPad".

A imagem aparecerá no visor do Pin Pad, porém ocorrerá um erro de timeout e isso impossibilita a execução dos próximos comandos. 

Estou utilizando para testes o PIN PAD PPC-930 versão 2.12 e estou com os drivers do fabricante instalados e atualizados.

Pode fazer alguns testes com esse equipamento?

LogArqPinPad.txt

Link para o comentário
Compartilhar em outros sites

  • Administradores

Tópico movido para a área do SAC, para que o SLA de respostas seja considerado

Consultora SAC ACBr

Juliana Tamizou

Gerente de Projetos ACBr / Diretora de Marketing AFRAC
Ajude o Projeto ACBr crescer - Seja Pro

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Eu não consegui reproduzir erros de TimeOut, com nosso PinPad PPC930

Que valor está na sua propriedade TACBrAbecsPinPad.TimeOut ?

A última chamada a DSI, parece ter ocorrido com sucesso...

Citar

-- 08/02 09:33:08:990 - DSI( QRCODE01 )
-- 08/02 09:33:08:991 - ExecCommand: DSI
-- 08/02 09:33:08:992 -   Command, Blocks: 1
-- 08/02 09:33:08:994 -     Block: 1, Size: 12, Data: \x00\x1E\x00\x08QRCODE01
-- 08/02 09:33:08:995 -       SPE_MFNAME, Size: 8, Data: QRCODE01
-- 08/02 09:33:08:997 -   SendCommand: DSI, BlockStart: 0
-- 08/02 09:33:08:999 -     DataPacket, 18 Bytes, 1 Blocks
-- 08/02 09:33:09:001 -   TX -> \x16DSI012\x00\x1E\x00\x08QRCODE01\x17e_
-- 08/02 09:33:09:001 -     WaitForACK
-- 08/02 09:33:09:005 -     RX <- 6
-- 08/02 09:33:09:007 -   WaitForResponse
-- 08/02 09:33:09:008 -   WaitForSYN
-- 08/02 09:33:10:928 -     RX <- 22
-- 08/02 09:33:10:930 -   SYN received
-- 08/02 09:33:10:931 -   WaitForDataPacket
-- 08/02 09:33:10:933 -   DataPacket: DSI000
-- 08/02 09:33:10:934 -     ReadCRC
-- 08/02 09:33:10:935 -     CRC: \x95E
-- 08/02 09:33:10:936 -   Response.STAT: 0
-- 08/02 09:33:10:938 -   Response, Blocks: 0
-- 08/02 09:33:10:939 -   EvaluateResponse: 0


Qual Linha do Log, você notou o Timeout ?

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

  • Membros Pro

Estou utilizando o padrão TACBrAbecsPinPad.TimeOut = 10000. Vou aumentar para 20000 para verificar se pode ser esse o problema.

Sei que para nesse momento porque no debug interrompe no comando " FACBrAbecsPinPad.DSI('QRCODPIX')" e capturo as seguintes mensagens de exceção (imagens em anexo).

Estou constantemente usando esses comandos para ir enviando múltiplas vezes o QRCode.

FACBrAbecsPinPad.LoadMedia('QRCODPIX', ms, mtPNG);

FACBrAbecsPinPad.DSI('QRCODPIX');

Não preciso excluir a imagem antes de enviar novamente? Posso simplesmente sempre enviar direto o DSI pro pinpad?
 

Imagem1.png

Imagem2.png

Link para o comentário
Compartilhar em outros sites

  • Fundadores
1 minuto atrás, WINDEL disse:

Não preciso excluir a imagem antes de enviar novamente? Posso simplesmente sempre enviar direto o DSI pro pinpad?

não precisa excluir, ele sobrepõem...

Consegue criar um "mini-demo", que eu possa usar para simular o problema ?

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

  • Membros Pro

Sim, eu consegui simular com o Demo Pin Pad Test mesmo realizando os seguintes passos

- Abrir o Aplicativo Teste ABECS Pin Pad
- Clicar no Botão "Ativar"
- Ir na Aba Multimedia e clicar no botão "Send to PinPad"
- Ir na Aba Display e clicar no botão "Clear Display".
- Voltar para a Aba Config e clicar no botão "Desativar"
- Fechar a aplicação

Repetir algumas vezes esse processo em modo debug para poder verificar a exceção levantada.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Fundadores

Olá @WINDEL,

Eu não consegui reproduzir o problema no meu PinPad Gertec PPC930

Você pode anexar o Log desse último teste ?

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

  • Membros Pro

Segue em anexo o vídeo e log. É necessário rodar em modo debug para visualizar a exceção levantada.

Como o tamanho máximo para upload é de 2mb, compartilhei o vídeo no google drive. Segue o link para verificar o vídeo de simulação

Vídeo: https://drive.google.com/file/d/1FWKW7mR4eHvlVqSEtm28QZDNJtPVNqiu/view?usp=sharing

Log.txt

Link para o comentário
Compartilhar em outros sites

  • Membros Pro

Quero apenas reforçar que para ver a exceção ocorrendo, é necessário rodar em modo debug, conforme o vídeo demonstra. Inclusive no memo foi logado que ocorreu a exceção.

Pode ser que se rodar em modo normal sem ser por debug, a exceção não ocorra, mas porque ela esteja sendo mascarada.

Meu receio quanto a isso é se depois de muitas vezes que rode o processo, o programa ir acumulando exceções mascaradas e assim possa acontecer de estourar e a aplicação se fechar sozinha devido a esse motivo.

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Olá @WINDEL,

Desculpe a demora na resposta...

Em 12/02/2024 at 10:31, WINDEL disse:

Como o tamanho máximo para upload é de 2mb, compartilhei o vídeo no google drive. Segue o link para verificar o vídeo de simulação

Pode por favor, pressionar Break nesse momento do Timeout, e enviar Print da tela no momento em que a IDE parou ?

Eu creio que seja um Exception controlado... A rotina do ABECS já preconiza tentar ler o ACK por até 3 vezes, em até 2 segundos.. eu acho que esses exceptions são tratados pelo código abaixo

procedure TACBrAbecsPinPad.ExecCommand(DoEvaluateResponse: Boolean); 
....
      // Send Data and Wait for ACK
      while (AckByte <> ACK) do
      begin
        BlockStart := max(BlockStart, 0);
        SendCommand(BlockStart, BlocksRead);
        AckByte := WaitForACK;

        if (AckByte = NAK) then
        begin
          Inc(ACKFails);
          if (ACKFails >= MAX_ACK_TRIES) then
            DoException(CERR_READING_ACK);
        end
        else if (AckByte <> ACK) then
          DoException(CERR_READING_ACK);
      end;  

 

 

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

  • Membros Pro

Segue as imagens das exceções que ocorrem. No memo está logando essa exceção como EACBrAbecsPinPadTimeout: Timeout reading Response

Essas exceções "controladas" não podem resultar em algum crash se forem disparadas muitas vezes?

imagem1.png

imagem2.png

Imagem3.png

Link para o comentário
Compartilhar em outros sites

  • Fundadores

@WINDEL, obrigado pelas telas...

Analisando o seu CallStack, notei que os Exceptions ocorriam dentro de WaitForSYN... na verdade eram Exceptions controlados.. ou seja, bastava ignorar...

Entretanto apliquei modificações nos fontes, que devem ficar mais claro, e sem a necessidade do Exception controlado.. Commit [r32492]

Citar

- melhoria em TACBrAbecsPinPad.SetIsEnabled , para limpar variáveis de Cache

- Ajuste em TACBrAbecsPinPad.ExecCommand para logar falhas no ACK
- Ajustes em TACBrAbecsPinPad.WaitForResponse,
- não levantar Exception de Timeout quando estiver aguardando SYN,
- Gravar bi log o "Time Left"
- Melhoria em TACBrAbecsPinPad.CancelWaiting, para não verificar desnecessariamente

 

PS: Também atualizei os Demos, com um botão interessante, para tentar Detectar a presença do PinPad

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

  • Fundadores
2 horas atrás, WINDEL disse:

imagem1.png

@WINDEL, nesse caso aqui.. parece que o próprio componente disparou o Exception..

Isso ocorre porque o TimeOut definido no componente foi atingido.. acho que você deixou o valor dele muito baixo.. (o default é 10000)
image.png

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

  • Membros Pro

Sim, por isso que estou achando estranho essas exceções que estão sendo geradas. No caso configurei o timeout para o dobro do default. Tentei colocar o valor de 20000 (dobro) e mesmo assim está ocorrendo isso.

image.png.47e6758d0080104e1e1baafefc76e0d6.png

Link para o comentário
Compartilhar em outros sites

  • Membros Pro

Baixei os fontes, instalei novamente e com alguns testes que fiz rodando em modo Debug não ocorreu mais aquela exceção do componente. 

Foi realizado algum ajuste para tratar a exceção? Continuo usando o timeout de 20000

 

Link para o comentário
Compartilhar em outros sites

  • Fundadores

A Exceção era prevista no código anterior.. tratava-se de um try/except controlado...

O Exception nunca ocorreria em produção, mas em Debug seria necessário marca a IDE para ignorar aquele tipo de exception...

Eu refatorei o código, removendo o fluxo por Exception

  • Curtir 1
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está agora fechado para novas respostas
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.