diff --git a/History.txt b/History.txt index 7eaa9cb7..3b6a070a 100644 --- a/History.txt +++ b/History.txt @@ -5,6 +5,13 @@ Company : SHTRIH-M www.shtrih-m.ru (495) 787-6090 Url : https://github.com/shtrih-m/javapos_shtrih +******************************************************************************** + + 28.10.2021 + deviceServiceVersion = 1013635 + + [-] Fixed error with device disconnect + ******************************************************************************** 19.10.2021 diff --git a/Source/Core/src/com/shtrih/fiscalprinter/PrinterProtocol_1.java b/Source/Core/src/com/shtrih/fiscalprinter/PrinterProtocol_1.java index d31a1f21..f9ac47c9 100644 --- a/Source/Core/src/com/shtrih/fiscalprinter/PrinterProtocol_1.java +++ b/Source/Core/src/com/shtrih/fiscalprinter/PrinterProtocol_1.java @@ -58,6 +58,9 @@ private void portWrite(int b) throws Exception { private void portWrite(byte[] data) throws Exception { Logger2.logTx(logger, data); + if (Thread.currentThread().isInterrupted()){ + throw new InterruptedException(); + } port.write(data); } diff --git a/Source/Core/src/com/shtrih/fiscalprinter/PrinterProtocol_2.java b/Source/Core/src/com/shtrih/fiscalprinter/PrinterProtocol_2.java index 67906f7e..02f64670 100644 --- a/Source/Core/src/com/shtrih/fiscalprinter/PrinterProtocol_2.java +++ b/Source/Core/src/com/shtrih/fiscalprinter/PrinterProtocol_2.java @@ -104,6 +104,9 @@ private void synchronizeFrames(int timeout) throws Exception { private void sendCommand(byte[] data) throws Exception { byte[] tx = frame.encode(data, frameNumber); Logger2.logTx(logger, tx); + if (Thread.currentThread().isInterrupted()){ + throw new InterruptedException(); + } port.write(tx); } diff --git a/Source/Core/src/com/shtrih/fiscalprinter/SMFiscalPrinter.java b/Source/Core/src/com/shtrih/fiscalprinter/SMFiscalPrinter.java index 62f1f4aa..d45f7cd5 100644 --- a/Source/Core/src/com/shtrih/fiscalprinter/SMFiscalPrinter.java +++ b/Source/Core/src/com/shtrih/fiscalprinter/SMFiscalPrinter.java @@ -713,4 +713,7 @@ public ReadOperationRegister readOperationRegister2(int number) public int mcClearBuffer() throws Exception; public Object getSyncObject() throws Exception; + + public String getFullSerial(); + } diff --git a/Source/Core/src/com/shtrih/fiscalprinter/SMFiscalPrinterImpl.java b/Source/Core/src/com/shtrih/fiscalprinter/SMFiscalPrinterImpl.java index b4d52704..33e1b895 100644 --- a/Source/Core/src/com/shtrih/fiscalprinter/SMFiscalPrinterImpl.java +++ b/Source/Core/src/com/shtrih/fiscalprinter/SMFiscalPrinterImpl.java @@ -148,8 +148,10 @@ enum Boolean { private PrinterDate lastDocDate = new PrinterDate(); private PrinterTime lastDocTime = new PrinterTime(); private long lastDocTotal = 0; - private volatile boolean stopFlag = true; + private volatile boolean stopFlag = false; + private volatile boolean interrupted = false; private Integer fdVersion = null; + private String fullSerial = ""; public SMFiscalPrinterImpl(PrinterPort port, PrinterProtocol device, FptrParameters params) { @@ -229,7 +231,7 @@ public void deviceExecute(PrinterCommand command) throws Exception { correctDate(); } - if (Thread.currentThread().isInterrupted()) { + if (interrupted || Thread.currentThread().isInterrupted()) { throw new InterruptedException(); } @@ -301,6 +303,7 @@ public LongPrinterStatus connect() throws Exception { check(readDeviceMetrics()); model = selectPrinterModel(getDeviceMetrics()); + fullSerial = readFullSerial(); return checkEcrMode(); } } @@ -1470,8 +1473,10 @@ public int fsStartDayOpen() throws Exception { return executeCommand(command); } - public void resetPrinter() throws Exception { + public void resetPrinter() throws Exception + { tlvItems.clear(); + interrupted = false; } public void writeTLVItems() throws Exception { @@ -3340,6 +3345,11 @@ public FSReadSerial fsReadSerial() throws Exception { return command; } + @Override + public String getFullSerial(){ + return fullSerial; + } + @Override public String readFullSerial() throws Exception { if (serial.isEmpty()) { @@ -3965,8 +3975,14 @@ public int reboot() throws Exception { return rc; } + public void interrupt() { + interrupted = true; + } + public void cancelWait() { + stopFlag = true; + } public void rebootAndWait() throws Exception { diff --git a/Source/Core/src/com/shtrih/fiscalprinter/SMFiscalPrinterNull.java b/Source/Core/src/com/shtrih/fiscalprinter/SMFiscalPrinterNull.java index 2b916fe7..988e2321 100644 --- a/Source/Core/src/com/shtrih/fiscalprinter/SMFiscalPrinterNull.java +++ b/Source/Core/src/com/shtrih/fiscalprinter/SMFiscalPrinterNull.java @@ -1276,4 +1276,8 @@ public Object getSyncObject() throws Exception { return null; } + public String getFullSerial(){ + return ""; + } + } diff --git a/Source/Core/src/com/shtrih/jpos/cashdrawer/CashDrawerImpl.java b/Source/Core/src/com/shtrih/jpos/cashdrawer/CashDrawerImpl.java index c47f7d13..21a71ef0 100644 --- a/Source/Core/src/com/shtrih/jpos/cashdrawer/CashDrawerImpl.java +++ b/Source/Core/src/com/shtrih/jpos/cashdrawer/CashDrawerImpl.java @@ -78,6 +78,7 @@ public class CashDrawerImpl extends DeviceService implements private boolean deviceEnabled = false; // internal classes private Thread deviceThread = null; // device poll thread + private volatile boolean deviceStopFlag = false; private Thread eventThread = null; // event delivery thread private final Vector events = new Vector(); private PrinterPort port; @@ -218,7 +219,7 @@ private void setDrawerOpened(boolean drawerOpened) { public void deviceProc() { try { - while (!deviceThread.isInterrupted()) { + while (!deviceStopFlag) { synchronized (printer) { try { connect(); @@ -273,11 +274,13 @@ public void setDeviceEnabled(boolean deviceEnabled) throws JposException { connect(); if (fptrParams.pollEnabled) { + deviceStopFlag = false; deviceThread = new Thread(new DeviceTarget(this)); deviceThread.start(); } } else { + deviceStopFlag = true; deviceThread.interrupt(); deviceThread.join(); deviceThread = null; diff --git a/Source/Core/src/com/shtrih/jpos/fiscalprinter/DeviceHeader.java b/Source/Core/src/com/shtrih/jpos/fiscalprinter/DeviceHeader.java index 71437eae..cac357a0 100644 --- a/Source/Core/src/com/shtrih/jpos/fiscalprinter/DeviceHeader.java +++ b/Source/Core/src/com/shtrih/jpos/fiscalprinter/DeviceHeader.java @@ -6,6 +6,7 @@ import com.shtrih.fiscalprinter.command.ReadTableInfo; import com.shtrih.util.CompositeLogger; import com.shtrih.util.Localizer; +import java.util.List; import java.util.Vector; @@ -15,8 +16,8 @@ public class DeviceHeader implements PrinterHeader { private final SMFiscalPrinter printer; - private final Vector header = new Vector(); - private final Vector trailer = new Vector(); + private final List header = new Vector(); + private final List trailer = new Vector(); private final CompositeLogger logger = CompositeLogger.getLogger(DeviceHeader.class); public DeviceHeader(SMFiscalPrinter printer) { @@ -177,4 +178,13 @@ public void endNonFiscal(String additionalTrailer) public void endFiscal(String additionalTrailer) throws Exception { } + + public List getHeaderLines(){ + return header; + } + + public List getTrailerLines(){ + return trailer; + } + } diff --git a/Source/Core/src/com/shtrih/jpos/fiscalprinter/DriverHeader.java b/Source/Core/src/com/shtrih/jpos/fiscalprinter/DriverHeader.java index abde5bd8..dc9cbc25 100644 --- a/Source/Core/src/com/shtrih/jpos/fiscalprinter/DriverHeader.java +++ b/Source/Core/src/com/shtrih/jpos/fiscalprinter/DriverHeader.java @@ -28,8 +28,8 @@ public class DriverHeader implements JposConst, PrinterHeader { private int lineNumber = 0; private int numHeaderLines = 0; private final SMFiscalPrinter printer; - private final Vector header = new Vector(); - private final Vector trailer = new Vector(); + private final List header = new Vector(); + private final List trailer = new Vector(); private final CompositeLogger logger = CompositeLogger.getLogger(DriverHeader.class); /** @@ -337,4 +337,12 @@ public void beginDocument(String additionalHeader) throws Exception printText(additionalHeader); } + public List getHeaderLines(){ + return header; + } + + public List getTrailerLines(){ + return trailer; + } + } diff --git a/Source/Core/src/com/shtrih/jpos/fiscalprinter/FSService.java b/Source/Core/src/com/shtrih/jpos/fiscalprinter/FSService.java index 54e9f43c..3e216a5e 100644 --- a/Source/Core/src/com/shtrih/jpos/fiscalprinter/FSService.java +++ b/Source/Core/src/com/shtrih/jpos/fiscalprinter/FSService.java @@ -27,6 +27,7 @@ public class FSService implements Runnable { private final int connectTimeout; private final SMFiscalPrinter printer; private volatile Thread thread = null; + private volatile boolean stopFlag = false; public FSService(SMFiscalPrinter printer, FptrParameters parameters, FDOParameters ofdParameters) { if (printer == null) { @@ -51,6 +52,7 @@ private boolean isStarted() { public void start() throws Exception { if (!isStarted()) { logger.debug("FSService starting"); + stopFlag = false; thread = new Thread(this); thread.start(); } @@ -60,6 +62,7 @@ public void stop() throws Exception { if (isStarted()) { logger.debug("FSService stopping"); + stopFlag = true; thread.interrupt(); thread.join(); thread = null; @@ -73,10 +76,8 @@ public void run() { parameters.getHost(), parameters.getPort(), connectTimeout, parameters.getPollPeriodSeconds() * 1000)); - while (!Thread.currentThread().isInterrupted()) { - synchronized (printer.getSyncObject()) { - checkData(); - } + while (!stopFlag) { + checkData(); Time.delay(parameters.getPollPeriodSeconds() * 1000); } } catch (InterruptedException e) { @@ -94,7 +95,7 @@ private void checkData() throws Exception { return; } // System.out.println("FS -> OFD: " + Hex.toHex(data)); - if (thread.isInterrupted()) { + if (stopFlag) { return; } byte[] answer = sendData(data); @@ -102,7 +103,7 @@ private void checkData() throws Exception { return; } // System.out.println("FS <- OFD: " + Hex.toHex(answer)); - if (thread.isInterrupted()) { + if (stopFlag) { return; } printer.fsWriteBlockData(answer); diff --git a/Source/Core/src/com/shtrih/jpos/fiscalprinter/FirmwareUpdaterService.java b/Source/Core/src/com/shtrih/jpos/fiscalprinter/FirmwareUpdaterService.java index c2645717..1c619c2d 100644 --- a/Source/Core/src/com/shtrih/jpos/fiscalprinter/FirmwareUpdaterService.java +++ b/Source/Core/src/com/shtrih/jpos/fiscalprinter/FirmwareUpdaterService.java @@ -29,11 +29,11 @@ public class FirmwareUpdaterService implements Runnable, IPrinterEvents { private final SMFiscalPrinter printer; - private volatile Thread thread = null; private long oldFirmwareVersion; private long newFirmwareVersion; private byte[] firmware; - + private volatile Thread thread = null; + private volatile boolean stopFlag = false; private FirmwareUpdateObserver listener = new FirmwareUpdateObserver(); public FirmwareUpdaterService(SMFiscalPrinter printer) { @@ -54,12 +54,12 @@ public void run() { Time.delay(5 * 1000); logger.debug("Starting FirmwareUpdaterService"); - while (!Thread.currentThread().isInterrupted()) + while (!stopFlag) { if (firmware == null) { checkData(); } - if (thread.isInterrupted()) break; + if (stopFlag) break; updateFirmware(); Time.delay(pollPeriodSeconds * 1000); @@ -76,7 +76,7 @@ public void run() { private void checkData() { try { - if (thread.isInterrupted()) return; + if (stopFlag) return; logger.debug("Checking for firmware update"); listener.OnCheckingForUpdate(); @@ -102,7 +102,7 @@ private void checkData() { firmwareVersion = printer.getDeviceMetrics().getModel() * 1000000 + printer.readLongStatus().getFirmwareBuild(); } - if (thread.isInterrupted()) return; + if (stopFlag) return; ScocClient client = new ScocClient(serialNumber, uin.longValue()); @@ -124,7 +124,7 @@ private void checkData() { out.write(firstResponse.getData()); - if (thread.isInterrupted()) return; + if (stopFlag) return; long newVersion = firstResponse.getFirmwareVersion(); @@ -137,7 +137,7 @@ private void checkData() { for (int i = 2; i <= firstResponse.getPartsCount(); i++) { - if (thread.isInterrupted()) return; + if (stopFlag) return; DeviceFirmwareResponse nextPart = client.readFirmware(newVersion, i); @@ -166,6 +166,7 @@ private boolean isStarted() { public void start() { if (!isStarted()) { firmware = null; + stopFlag = false; thread = new Thread(this); thread.start(); } @@ -174,6 +175,7 @@ public void start() { public void stop() throws Exception { if (isStarted()) { printer.cancelWait(); + stopFlag = true; thread.interrupt(); thread.join(); thread = null; @@ -225,7 +227,7 @@ private void updateFirmware() throws Exception writeFirmware(); - if (thread.isInterrupted()) return; + if (stopFlag) return; long doneAt = System.currentTimeMillis(); @@ -259,7 +261,7 @@ private void writeFirmware() throws Exception { while (stream.available() > 0) { - if (thread.isInterrupted()) return; + if (stopFlag) return; stream.read(block, 0, 128); printer.writeFirmwareBlockToSDCard(fileType, blockNumber, block); diff --git a/Source/Core/src/com/shtrih/jpos/fiscalprinter/FiscalPrinterImpl.java b/Source/Core/src/com/shtrih/jpos/fiscalprinter/FiscalPrinterImpl.java index 02c8695a..6b8c6218 100644 --- a/Source/Core/src/com/shtrih/jpos/fiscalprinter/FiscalPrinterImpl.java +++ b/Source/Core/src/com/shtrih/jpos/fiscalprinter/FiscalPrinterImpl.java @@ -270,6 +270,8 @@ public class FiscalPrinterImpl extends DeviceService implements PrinterConst, private boolean docEndEnabled = true; private JsonUpdateService jsonUpdateService = null; private boolean disablePrintOnce = false; + private volatile boolean pollStopFlag = false; + private volatile boolean eventStopFlag = false; public void enableTextDocumentFilter(boolean value) { filter.setEnabled(value); @@ -830,7 +832,7 @@ private void executePrinterRequest(FiscalPrinterRequest request) { // event delivery routine public void eventProc() { try { - while (!Thread.currentThread().isInterrupted()) { + while (!eventStopFlag) { synchronized (events) { while (!events.isEmpty()) { ((Runnable) events.remove(0)).run(); @@ -874,6 +876,7 @@ public void updateStatus(PrinterStatus status) throws Exception { private void startPoll() throws Exception { if (deviceThread == null) { logger.debug("Poll thread starting..."); + pollStopFlag = false; deviceThread = new Thread(new DeviceTarget(this)); deviceThread.start(); } @@ -882,6 +885,7 @@ private void startPoll() throws Exception { private void stopPoll() throws Exception { if (deviceThread != null) { logger.debug("Poll thread stopping..."); + pollStopFlag = true; deviceThread.interrupt(); deviceThread.join(); deviceThread = null; @@ -1214,10 +1218,12 @@ public void setFreezeEvents(boolean freezeEvents) throws Exception { } private void stopEventThread() throws Exception { - if (eventThread != null) { + if (eventThread != null) + { synchronized (events) { events.notifyAll(); } + eventStopFlag = true; eventThread.interrupt(); eventThread.join(); eventThread = null; @@ -1226,6 +1232,7 @@ private void stopEventThread() throws Exception { private void startEventThread() throws Exception { if (eventThread == null) { + eventStopFlag = false; eventThread = new Thread(new EventTarget(this)); eventThread.start(); } @@ -4350,7 +4357,7 @@ public void checkDeviceStatus() throws Exception { public void deviceProc() { logger.debug("Poll thread started"); try { - while (!Thread.currentThread().isInterrupted()) { + while (!pollStopFlag) { checkDeviceStatus(); Thread.sleep(params.pollInterval); } @@ -4493,7 +4500,7 @@ public void saveProperties() throws Exception { } try { - String serial = "FiscalPrinter_" + getPrinter().readFullSerial(); + String serial = "FiscalPrinter_" + getPrinter().getFullSerial(); XmlPropWriter writer = new XmlPropWriter("FiscalPrinter", serial); writer.write(getPrinterImages()); diff --git a/Source/Core/src/com/shtrih/jpos/fiscalprinter/NullHeader.java b/Source/Core/src/com/shtrih/jpos/fiscalprinter/NullHeader.java index b251ed68..3852af0c 100644 --- a/Source/Core/src/com/shtrih/jpos/fiscalprinter/NullHeader.java +++ b/Source/Core/src/com/shtrih/jpos/fiscalprinter/NullHeader.java @@ -2,6 +2,7 @@ import com.shtrih.fiscalprinter.SMFiscalPrinter; import com.shtrih.util.Localizer; +import java.util.List; import jpos.JposConst; import jpos.JposException; @@ -90,5 +91,13 @@ public void endFiscal(String additionalTrailer) @Override public void endNonFiscal(String additionalTrailer) throws Exception { - } + } + + public List getHeaderLines(){ + return null; + } + + public List getTrailerLines(){ + return null; + } } diff --git a/Source/Core/src/com/shtrih/jpos/fiscalprinter/PrinterHeader.java b/Source/Core/src/com/shtrih/jpos/fiscalprinter/PrinterHeader.java index 0e28954b..9e1f0076 100644 --- a/Source/Core/src/com/shtrih/jpos/fiscalprinter/PrinterHeader.java +++ b/Source/Core/src/com/shtrih/jpos/fiscalprinter/PrinterHeader.java @@ -1,5 +1,7 @@ package com.shtrih.jpos.fiscalprinter; +import java.util.List; + public interface PrinterHeader { public void initDevice() throws Exception; @@ -30,4 +32,8 @@ public void endFiscal(String additionalTrailer) public void endNonFiscal(String additionalTrailer) throws Exception; + + public List getHeaderLines(); + + public List getTrailerLines(); } diff --git a/Source/Core/src/com/shtrih/jpos/fiscalprinter/XmlPropWriter.java b/Source/Core/src/com/shtrih/jpos/fiscalprinter/XmlPropWriter.java index 9eb9098c..6adcecd8 100644 --- a/Source/Core/src/com/shtrih/jpos/fiscalprinter/XmlPropWriter.java +++ b/Source/Core/src/com/shtrih/jpos/fiscalprinter/XmlPropWriter.java @@ -5,6 +5,7 @@ */ package com.shtrih.jpos.fiscalprinter; +import java.util.List; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -16,96 +17,97 @@ */ public class XmlPropWriter { - private final Document doc; - private Element root; - private Element node; - - public XmlPropWriter(String className, String deviceName) throws Exception { - doc = XmlUtils.newDocument(); - root = doc.createElement("root"); - doc.appendChild(root); - node = doc.createElement(className); - root.appendChild(node); - root = node; - - node = doc.createElement(deviceName); - root.appendChild(node); - root = node; - } - - public void save(String fileName) throws Exception { - XmlUtils.save(doc, fileName); - } - - public void addParameter(Element node, String name, Object value) - throws Exception { - node.setAttribute(name, String.valueOf(value)); - } - - public void write(PrinterImages images) throws Exception { - node = doc.createElement("Images"); - root.appendChild(node); - for (int i = 0; i < images.size(); i++) { - write(images.get(i)); - } - } - - public void writeNonFiscalDocNumber(int number) throws Exception - { - Element childNode = doc.createElement("NonFiscal"); - root.appendChild(childNode); - addParameter(childNode, "DocumentNumber", number); - } - - public void write(PrinterImage image) throws Exception { - Element imageNode = doc.createElement("Image"); - node.appendChild(imageNode); - - addParameter(imageNode, "FileName", image.getFileName()); - addParameter(imageNode, "Digest", image.getDigest()); - addParameter(imageNode, "Height", new Integer(image.getHeight())); - addParameter(imageNode, "FirstLine", new Integer(image.getStartPos())); - addParameter(imageNode, "IsLoaded", - StringUtils.boolToStr(image.getIsLoaded())); - } - - public void write(ReceiptImages images) throws Exception - { - node = doc.createElement("ReceiptImages"); - root.appendChild(node); - for (int i = 0; i < images.size(); i++) { - write(images.get(i)); - } - } - - public void write(ReceiptImage image) throws Exception { - Element imageNode = doc.createElement("ReceiptImage"); - node.appendChild(imageNode); - addParameter(imageNode, "ImageIndex", - new Integer(image.getImageIndex())); - addParameter(imageNode, "Position", new Integer(image.getPosition())); - } - - public void writePrinterHeader(PrinterHeader header) throws Exception { - node = doc.createElement("Header"); - root.appendChild(node); - for (int i = 1; i <= header.getNumHeaderLines(); i++) { - write(header.getHeaderLine(i)); - } - node = doc.createElement("Trailer"); - root.appendChild(node); - for (int i = 1; i <= header.getNumTrailerLines(); i++) { - write(header.getTrailerLine(i)); - } - } - - public void write(HeaderLine line) throws Exception { - if (line == null) - return; - Element lineNode = doc.createElement("Line"); - node.appendChild(lineNode); - addParameter(lineNode, "Text", line.getText()); - addParameter(lineNode, "DoubleWidth", StringUtils.boolToStr(line.isDoubleWidth())); - } + private final Document doc; + private Element root; + private Element node; + + public XmlPropWriter(String className, String deviceName) throws Exception { + doc = XmlUtils.newDocument(); + root = doc.createElement("root"); + doc.appendChild(root); + node = doc.createElement(className); + root.appendChild(node); + root = node; + + node = doc.createElement(deviceName); + root.appendChild(node); + root = node; + } + + public void save(String fileName) throws Exception { + XmlUtils.save(doc, fileName); + } + + public void addParameter(Element node, String name, Object value) + throws Exception { + node.setAttribute(name, String.valueOf(value)); + } + + public void write(PrinterImages images) throws Exception { + node = doc.createElement("Images"); + root.appendChild(node); + for (int i = 0; i < images.size(); i++) { + write(images.get(i)); + } + } + + public void writeNonFiscalDocNumber(int number) throws Exception { + Element childNode = doc.createElement("NonFiscal"); + root.appendChild(childNode); + addParameter(childNode, "DocumentNumber", number); + } + + public void write(PrinterImage image) throws Exception { + Element imageNode = doc.createElement("Image"); + node.appendChild(imageNode); + + addParameter(imageNode, "FileName", image.getFileName()); + addParameter(imageNode, "Digest", image.getDigest()); + addParameter(imageNode, "Height", new Integer(image.getHeight())); + addParameter(imageNode, "FirstLine", new Integer(image.getStartPos())); + addParameter(imageNode, "IsLoaded", + StringUtils.boolToStr(image.getIsLoaded())); + } + + public void write(ReceiptImages images) throws Exception { + node = doc.createElement("ReceiptImages"); + root.appendChild(node); + for (int i = 0; i < images.size(); i++) { + write(images.get(i)); + } + } + + public void write(ReceiptImage image) throws Exception { + Element imageNode = doc.createElement("ReceiptImage"); + node.appendChild(imageNode); + addParameter(imageNode, "ImageIndex", + new Integer(image.getImageIndex())); + addParameter(imageNode, "Position", new Integer(image.getPosition())); + } + + public void writePrinterHeader(PrinterHeader header) throws Exception { + node = doc.createElement("Header"); + root.appendChild(node); + List lines = header.getHeaderLines(); + for (int i = 0; i < lines.size(); i++) { + write(lines.get(i)); + } + node = doc.createElement("Trailer"); + root.appendChild(node); + lines = header.getTrailerLines(); + for (int i = 0; i < lines.size(); i++) { + write(lines.get(i)); + } + } + + public void write(HeaderLine line) throws Exception { + if (line == null) { + return; + } + Element lineNode = doc.createElement("Line"); + node.appendChild(lineNode); + addParameter(lineNode, "Text", line.getText()); + addParameter(lineNode, "DoubleWidth", StringUtils.boolToStr(line.isDoubleWidth())); + } } diff --git a/Source/Core/src/com/shtrih/jpos/monitoring/MonitoringServerX5.java b/Source/Core/src/com/shtrih/jpos/monitoring/MonitoringServerX5.java index 86dfcd9c..8ad9dc1a 100644 --- a/Source/Core/src/com/shtrih/jpos/monitoring/MonitoringServerX5.java +++ b/Source/Core/src/com/shtrih/jpos/monitoring/MonitoringServerX5.java @@ -24,7 +24,8 @@ public class MonitoringServerX5 implements Runnable { private int port = 0; - private Thread thread = null; + private volatile Thread thread = null; + private volatile boolean stopFlag = false; private final FiscalPrinterImpl service; private static CompositeLogger logger = CompositeLogger.getLogger(MonitoringServerX5.class); @@ -45,12 +46,14 @@ public void start(int port) throws Exception { } this.port = port; + stopFlag = false; Thread thread = new Thread(this); thread.start(); } public void stop() throws Exception { if (isStarted()) { + stopFlag = true; thread.interrupt(); thread.join(); thread = null; diff --git a/Source/FiscalPrinterTest/src/PrinterTest.java b/Source/FiscalPrinterTest/src/PrinterTest.java index 6d5c68aa..f67dbac7 100644 --- a/Source/FiscalPrinterTest/src/PrinterTest.java +++ b/Source/FiscalPrinterTest/src/PrinterTest.java @@ -1025,6 +1025,7 @@ public void printFiscalReceipt() { //printer.readFiscalizationTLV(1); printSalesReceipt1235(); + //printFiscalReceipt145_4(); } catch (Exception e) { e.printStackTrace(); @@ -3804,7 +3805,11 @@ public void printFiscalReceipt145_4() { printer.beginFiscalReceipt(false); barcode = "010304109478744321c_oMk?KrXtola" + GS + "93dGVz"; - printer.addItemCode(barcode.getBytes()); + String QRCodeData = "010464007801637221AgqLybqxM9MbR\u001d91FFD0\u001d92dGVzdL31KAYL0YT6592MjmW7a2HkF3IY+muf2pVSKdQ="; + byte[] data = QRCodeData.getBytes(); + System.out.println("Barcode: " + Hex.toHex(data)); + + printer.addItemCode(data); printer.printRecItem("1. СДОБА ЗАМОСКВОРЕЦКАЯ", 3200, 1000, 2, 3200, "шт"); printer.printRecItemAdjustment(1, " 1206", 320, 2); diff --git a/Source/android/FptrServiceAndroid/src/com/shtrih/fiscalprinter/port/BluetoothPort.java b/Source/android/FptrServiceAndroid/src/com/shtrih/fiscalprinter/port/BluetoothPort.java index dab8c2eb..2bc26e10 100644 --- a/Source/android/FptrServiceAndroid/src/com/shtrih/fiscalprinter/port/BluetoothPort.java +++ b/Source/android/FptrServiceAndroid/src/com/shtrih/fiscalprinter/port/BluetoothPort.java @@ -1,11 +1,16 @@ package com.shtrih.fiscalprinter.port; +import android.content.Intent; +import android.content.Context; +import android.content.IntentFilter; +import android.content.BroadcastReceiver; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothSocket; import com.shtrih.util.CompositeLogger; import com.shtrih.util.Localizer; +import com.shtrih.util.StaticContext; import com.shtrih.util.Time; import java.io.IOException; @@ -26,6 +31,7 @@ public class BluetoothPort implements PrinterPort { private int timeout = 5000; private int openTimeout = 5000; private String portName = ""; + private BluetoothDevice device = null; private BluetoothSocket socket = null; private static CompositeLogger logger = CompositeLogger.getLogger(BluetoothPort.class); @@ -78,16 +84,16 @@ public void setOpenTimeout(int openTimeout) { this.openTimeout = openTimeout; } - private InputStream inputStream; - private OutputStream outputStream; - @Override - public void open(int timeout) throws Exception { + public void open(int timeout) throws Exception + { + Thread.sleep(0); // check thread interrupted + if (isClosed()) { BluetoothAdapter adapter = getBluetoothAdapter(); if (BluetoothAdapter.checkBluetoothAddress(portName)) { // portName is valid MAC address - BluetoothDevice device = adapter.getRemoteDevice(portName); + device = adapter.getRemoteDevice(portName); connectDevice(device); } else { // portName is deviceName prefix, for example "SHTRIH-NANO-F" @@ -111,6 +117,29 @@ public void open(int timeout) throws Exception { } } + private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() + { + + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + switch (action){ + case BluetoothDevice.ACTION_ACL_DISCONNECTED: + BluetoothDevice btdevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); + if (btdevice.equals(device)) + { + try { + socket.close(); + socket = null; + }catch(Exception e){ + logger.error("ACTION_ACL_DISCONNECTED: ", e); + } + } + break; + } + } + }; + private void connectDevice(BluetoothDevice device) throws Exception { if (device == null) { @@ -125,12 +154,13 @@ private void connectDevice(BluetoothDevice device) throws Exception } socket.connect(); - inputStream = socket.getInputStream(); - outputStream = socket.getOutputStream(); + registerReceiver(); return; + } catch (IOException e) { close(); } + try { // IOException - create new socket socket = (BluetoothSocket) device.getClass() @@ -140,14 +170,25 @@ private void connectDevice(BluetoothDevice device) throws Exception throw new Exception("Failed to get bluetooth device socket"); } socket.connect(); - inputStream = socket.getInputStream(); - outputStream = socket.getOutputStream(); + registerReceiver(); + } catch (Exception e) { close(); throw e; } } + private void registerReceiver() { + try { + // events + IntentFilter filter = new IntentFilter(); + filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED); + StaticContext.getContext().registerReceiver(mBroadcastReceiver, filter); + }catch(Exception e){ + logger.error("Failed to register receiver, " + e.getMessage()); + } + } + private BluetoothAdapter getBluetoothAdapter() throws Exception { BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); if (adapter == null) { @@ -191,17 +232,16 @@ private void waitBluetoothAdapterStateOn(BluetoothAdapter adapter, } @Override - public synchronized void close() { + public synchronized void close() + { if (isOpened()) { try { socket.close(); + StaticContext.getContext().unregisterReceiver(mBroadcastReceiver); } catch (Exception e) { logger.error("Bluetooth socket close failed", e); } } - - inputStream = null; - outputStream = null; socket = null; } @@ -210,7 +250,7 @@ public synchronized boolean isOpened() { } public synchronized boolean isClosed() { - return socket == null; + return !isOpened(); } @Override @@ -219,7 +259,7 @@ public synchronized void setTimeout(int timeout) { } private void connect() throws Exception { - if (socket == null) { + if (isClosed()) { open(openTimeout); } } @@ -227,9 +267,11 @@ private void connect() throws Exception { @Override public void write(byte[] b) throws Exception { connect(); + OutputStream os = socket.getOutputStream(); + try { - outputStream.write(b); - outputStream.flush(); + os.write(b); + os.flush(); } catch (IOException e) { close(); throw e; @@ -256,7 +298,7 @@ public byte[] readBytes(int len) throws Exception { public int readByte() throws Exception { try { int result; - InputStream is = inputStream; + InputStream is = socket.getInputStream(); long startTime = System.currentTimeMillis(); while (true) { if (is.available() == 0) { diff --git a/Source/android/tinyJavaPosTester/assets/jpos.xml b/Source/android/tinyJavaPosTester/assets/jpos.xml index e317e0c4..d385493d 100644 --- a/Source/android/tinyJavaPosTester/assets/jpos.xml +++ b/Source/android/tinyJavaPosTester/assets/jpos.xml @@ -93,7 +93,7 @@ - +