OpenAC-Net / OpenAC.Net.EscPos

Componente para comunicação e impressão em impressoras térmicas usando o protocolo EscPos.
MIT License
13 stars 5 forks source link

Status do Papel #5

Open jblqueiroz opened 1 year ago

jblqueiroz commented 1 year ago

Olá, tudo bem? Estou utilizando a sua solução e achei excelente. Parabéns. Utilizo a EPSON TM-T20x e utilizava PosPrinter para Framework e migrei para NetCore 7 utilizando a sua solução.

Antes no PosPrinter eu conseguia receber as informações de tampa aberta, sem papel, entre outros.

Existe algum método que recebe um retorno dos status de erro da impressora como os citados acima?

Desde já agradeço pela sua atenção,

Att.,

João Queiroz

rftd commented 1 year ago

tem a função LerStatusImpressora que retorna os status da impressora.

jblqueiroz commented 1 year ago

Entendi. Quando utilizo essa função retorna "Nenhum", mesmo com a tampa aberta, ou sem papel.

rftd commented 1 year ago

Cara eu testei na epoca, e so funfava em serial e tcp senão to errado. Depois eu dou uma testada tenho que tirar minha epson da caixa.

jblqueiroz commented 1 year ago

Show de bola. Vamos usando assim por enquanto. É que utilizamos em impressoras que ficam longe dos operadores, que precisam receber a informação quando o papel acaba.

Obrigado pelo retorno.

rftd commented 1 year ago

Então se estiver usando a impressora por TCP da para pegar Status, agora se usar por RAW(Spool do Windows) é impossível pegar o status, pois não tem comunicação com a impressora toda.

jblqueiroz commented 1 year ago

Boa tarde, Rafael. Tudo bem? Obrigado pelo retorno. Estou utilizando a impressora por TCP. Eu tento utilizar a função LerStatusImpressora e sempre retorna "Nenhum". Tudo está funcionando certinho, a impressão de qrcode, código de barras, formatação de textos, apenas essa parte do status que não.

jblqueiroz commented 1 year ago

Olá Rafael, tudo bem? Continuo com o mesmo problema de retornar "Nenhum" na função LerStatusImpressora(), utilizando TCP/IP. Eu deixo a tampa aberta, a impressora sem papel e não muda nada. Você conseguiu fazer os testes?

Obrigado pela atenção, a api é muito boa, só está com esses problemas de não conseguirmos verificar o status da impressora.

jblqueiroz commented 1 year ago

Eu não sei se ajuda, mas o método LerStatus da api não está tratando quando a impressora está sem papel, ou com a tampa aberta. Acredito que falte implementar algo aqui.

public EscPosTipoStatus LerStatusImpressora(int tentativas = 1) { Guard.Against(!Conectado, "A porta não está aberta");

    if (interpreter.Status == null) return EscPosTipoStatus.ErroLeitura;

    try
    {
        byte[][] ret;
        var leituras = 0;
        do
        {
            var dados = interpreter.Status.Commands;
            if (dados.IsNullOrEmpty()) return EscPosTipoStatus.Nenhum;

            ret = dados.Select(dado => device.WriteRead(dado, 10)).ToArray();
            leituras++;
        } while (leituras < tentativas && !ret.Any());

        if (!ret.Any()) return EscPosTipoStatus.ErroLeitura;

        var status = interpreter.Status.Resolve(ret);
        if (!Gaveta.SinalInvertido) return status;

        if (status.HasFlag(EscPosTipoStatus.GavetaAberta))
            status &= ~EscPosTipoStatus.GavetaAberta;
        else
            status |= EscPosTipoStatus.GavetaAberta;

        return status;
    }
    catch (Exception ex)
    {
        this.Log().Error("Erro ao ler status", ex);
        return EscPosTipoStatus.ErroLeitura;
    }
}
rftd commented 1 year ago

Não é ai que faz o tratamento do status. A classe que cuida do status no caso da Epson é a classe EpsonStatusResolver.

jblqueiroz commented 1 year ago

Bom dia, tudo bem? E como que usa a classe EpsonStatusResolver? Pq quando construo o objeto abaixo, e só tem a opção LerStatusImpressora que sempre me retorna "Nenhum".

O que eu não estou conseguindo entender é como pegar o status após a conexão em uma impressora Epson.

printer = new EscPosPrinter(tcpConfig); printer.Protocolo = ProtocoloEscPos.EscPos; printer.PaginaCodigo = PaginaCodigo.pcUTF8; printer.Device.ControlePorta = true; printer.EspacoEntreLinhas = (byte)0; printer.LinhasEntreCupons = (byte)0;

printer.Conectar();

var status = printer.LerStatusImpressora().ToString()

Aqui sempre da "Nenhum" mesmo com a tampa aberta ou sem papel entendeu?

Eu preciso que a impressora me retorne se está sem papel ou alguma outra falha de impressão, pq o operador não fica perto da impressora, e sem esse retorno eu não consigo avisar ao operador que o papel acabou para o mesmo ir trocar.

Eu percebi que quando não imprime não retorna nada.. ai qdo coloco o papel realiza as impressões que não sairam, mas não é funcional na forma que vamos utilizar.

Desculpa incomodar.. é q eu não estou conseguindo encontrar uma forma =).. eu já fiz tudo.. está perfeito.. só falta isso.

rftd commented 1 year ago

então o status é baseado em bitwise, tu manda uns comandos para impressora e ela teoricamente te retorna uns bytes e tu compara para saber qual o retorno. Tem o manual EscPos para conferir isso

https://reference.epson-biz.com/modules/ref_escpos/index.php?content_id=118

rftd commented 1 year ago

eu realmente to sem tempo para ficar conferindo isso