Ситуация:
1) Печатаем чек продажи, вызываем метод com.shtrih.jpos.fiscalprinter.FiscalPrinterImpl#endFiscalReceipt
2) Открываем крышку в середине печати чека, но аккуратно, чтобы чековая лента не отошла от датчика бумаги.
3) StatusUpdateEvent об открытии крышки не приходит, программа не понимает почему так долго печатается чек.
4) Отводим чековую ленту от датчика бумаги. Только после этого метод com.shtrih.jpos.fiscalprinter.FiscalPrinterImpl#endFiscalReceipt завершается. Приходит StatusUpdateEvent об открытии крышки.
Аналогичная ситуация с печатью Z-отчета.
Причина:
При печати чека (метод com.shtrih.jpos.fiscalprinter.FiscalPrinterImpl#endFiscalReceipt) или Z-отчета (метод com.shtrih.jpos.fiscalprinter.FiscalPrinterImpl#printZReport) мы в конце концов оказываемся в методе com.shtrih.fiscalprinter.SMFiscalPrinterImpl#waitForPrinting получив эксклюзивный доступ к устройству
synchronized (printer) {...}
Метод waitForPrinting опрашивает устройство в цикле, имея при этом эксклюзивный доступ к устройству.
StatusUpdateEvent генерируются в другом потоке(создается в методе com.shtrih.jpos.fiscalprinter.FiscalPrinterImpl#startPoll). Данный потоке в методе com.shtrih.jpos.fiscalprinter.FiscalPrinterImpl#checkDeviceStatus не может получить эксклюзивный доступ к устройству и, как следствие, отправить StatusUpdateEvent об открытии крышки.
Возможное решение
В методе com.shtrih.fiscalprinter.SMFiscalPrinterImpl#waitForPrinting проверять не только статус бумаги, но и статус крышки. То есть создать метод checkCoverаналогично методу com.shtrih.fiscalprinter.SMFiscalPrinterImpl#checkPaper. При открытой крышке возвращать JposException с ErrorCodeExtended= jpos.FiscalPrinterConst#JPOS_EFPTR_COVER_OPEN
Ситуация: 1) Печатаем чек продажи, вызываем метод
com.shtrih.jpos.fiscalprinter.FiscalPrinterImpl#endFiscalReceipt
2) Открываем крышку в середине печати чека, но аккуратно, чтобы чековая лента не отошла от датчика бумаги. 3) StatusUpdateEvent об открытии крышки не приходит, программа не понимает почему так долго печатается чек. 4) Отводим чековую ленту от датчика бумаги. Только после этого методcom.shtrih.jpos.fiscalprinter.FiscalPrinterImpl#endFiscalReceipt
завершается. Приходит StatusUpdateEvent об открытии крышки.Аналогичная ситуация с печатью Z-отчета.
Причина: При печати чека (метод
com.shtrih.jpos.fiscalprinter.FiscalPrinterImpl#endFiscalReceipt
) или Z-отчета (методcom.shtrih.jpos.fiscalprinter.FiscalPrinterImpl#printZReport
) мы в конце концов оказываемся в методеcom.shtrih.fiscalprinter.SMFiscalPrinterImpl#waitForPrinting
получив эксклюзивный доступ к устройствуsynchronized (printer) {...}
МетодwaitForPrinting
опрашивает устройство в цикле, имея при этом эксклюзивный доступ к устройству.StatusUpdateEvent генерируются в другом потоке(создается в методе
com.shtrih.jpos.fiscalprinter.FiscalPrinterImpl#startPoll
). Данный потоке в методеcom.shtrih.jpos.fiscalprinter.FiscalPrinterImpl#checkDeviceStatus
не может получить эксклюзивный доступ к устройству и, как следствие, отправить StatusUpdateEvent об открытии крышки.Возможное решение В методе
com.shtrih.fiscalprinter.SMFiscalPrinterImpl#waitForPrinting
проверять не только статус бумаги, но и статус крышки. То есть создать методcheckCover
аналогично методуcom.shtrih.fiscalprinter.SMFiscalPrinterImpl#checkPaper
. При открытой крышке возвращать JposException с ErrorCodeExtended=jpos.FiscalPrinterConst#JPOS_EFPTR_COVER_OPEN