From c9de98460862c98fa091e8aecbbdf4d57ab1151a Mon Sep 17 00:00:00 2001 From: Guido Longoni Date: Wed, 25 Sep 2019 10:37:52 +0200 Subject: [PATCH] weaponizzata la logica di controllo della stampante --- .gitignore | 7 +- MkpWIFI/conf.json | 52 ++++++----- MkpWIFI/main.py | 217 ++++++++++++--------------------------------- MkpWIFI/printer.py | 132 +++++++++++++++++++++++++++ 4 files changed, 229 insertions(+), 179 deletions(-) create mode 100644 MkpWIFI/printer.py diff --git a/.gitignore b/.gitignore index cb86180..4de7254 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,6 @@ -MkpWIFI/__pycache__ +# VS Codium user settings directory +.vscode + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] \ No newline at end of file diff --git a/MkpWIFI/conf.json b/MkpWIFI/conf.json index 472b27b..764608d 100644 --- a/MkpWIFI/conf.json +++ b/MkpWIFI/conf.json @@ -1,21 +1,33 @@ { - "ip":"192.168.40.214", - "port": 8899, - "name":"MKPsouplesse", - "autoconnect":true, - "keepalive":5000, - "timeout": 0.5, - "inkstat" : 2, - "printcmd": { - "filename":"TM1.00I", - "dateformat": "%d%m%y-", - "handshake" : "*", - "printmode" : "11", - "headstatus" : [ - "ink", "htmr", "iuse", "xclk", "bat", - "txt", "pause", "headOk", "headTyp", - "labelCnt", "ztv", "cp", "lx", "exInk", - "scStat", "inkStat" - ] - } -} \ No newline at end of file + "ip": "192.168.40.30", + "port": 8899, + "name": "MKPsouplesse", + "autoconnect": true, + "keepalive": 5000, + "timeout": 0.5, + "inkstat": 2, + "printcmd": { + "filename": "TM1.00I", + "dateformat": "%d%m%y-", + "handshake": "*", + "printmode": "11", + "headstatus": [ + "ink", + "htmr", + "iuse", + "xclk", + "bat", + "txt", + "pause", + "headOk", + "headTyp", + "labelCnt", + "ztv", + "cp", + "lx", + "exInk", + "scStat", + "inkStat" + ] + } +} diff --git a/MkpWIFI/main.py b/MkpWIFI/main.py index 016efd2..e302c81 100644 --- a/MkpWIFI/main.py +++ b/MkpWIFI/main.py @@ -5,186 +5,87 @@ Created on 8 apr 2019 ''' import sys -import time import datetime -import socket -import json import PyQt5.QtWidgets -from MkpWIFI.MKPrint_GUI import Ui_MainWindow +from MKPrint_GUI import Ui_MainWindow +from printer import MarkoPrinter -class main(PyQt5.QtWidgets.QMainWindow): - - def __init__(self): +class MainWindow(PyQt5.QtWidgets.QMainWindow): + def __init__(self, configFilePath): + try: + self.printer = MarkoPrinter(configFilePath) + except FileNotFoundError as e: + print("Configuration file error: {}".format(e)) + sys.exit(1) + PyQt5.QtWidgets.QMainWindow.__init__(self) self.ui = Ui_MainWindow() self.ui.setupUi(self) self.setFixedSize(self.maximumSize()) self.setWindowTitle("Manda Etichette a Marcatrice") - - self.inkStatCounter = 0 - self.printer = None - self.headStatus = dict() - self.connected = False - self.sending = False self.timer = PyQt5.QtCore.QTimer() - - self.ui.btn_connect.clicked.connect(self.connetti) + self.ui.btn_connect.clicked.connect(self.toggla_connessione) self.ui.btn_upload.clicked.connect(self.upload) - self.ui.btn_upload.setEnabled(False) self.ui.rad_dataOn.setChecked(True) - self.ui.prg_inkLevel.setTextVisible(True) - - try: - self.setFile = open("conf.json", "r") - self.settings = json.load(self.setFile) - self.data = self.settings["printcmd"] - except FileNotFoundError as e: - print("Configuration file error: {}".format(e)) - sys.exit(1) - pass - - def connetti(self): - if not self.connected: - if self.printer is None: - try: - self.printer = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.printer.connect((self.settings["ip"], self.settings["port"])) - self.printer.settimeout(0.5) - self.ui.btn_connect.setText("DISCONNETTI") - self.ui.lbl_stat.setText("Connesso") - self.ui.btn_upload.setEnabled(True) - self.connected = True - self.status() - self.timer.start(self.settings["keepalive"]) - self.timer.timeout.connect(self.keepalive) - except socket.error as e : - print ("Connessione Fallita: {}".format(e)) - self.printer = None - self.connected = False - pass + + def updateStatusView(self): + connessa = self.printer.connected + self.ui.btn_upload.setEnabled(connessa) + if connessa: + self.ui.prg_inkLevel.setValue(self.printer.headStatus["iuse"]) + self.ui.lcd_printCount.display( + str(self.printer.headStatus["labelCnt"])) + else: + self.ui.prg_inkLevel.setValue(0) + self.ui.lcd_printCount.display('0') + + def toggla_connessione(self): + connessa = self.printer.connected + if connessa: + connessa = self.printer.disconnetti() + else: + connessa = self.printer.connetti() + if connessa: + self.ui.btn_connect.setText("DISCONNETTI") + self.ui.lbl_stat.setText("Connesso") + self.timer.start(self.printer.settings["keepalive"]) + self.timer.timeout.connect(self.keepalive) else: - self.disconnetti() - pass - pass - - def disconnetti(self): - if self.connected: self.timer.stop() - self.connected = False - self.ui.btn_connect.setText("CONNETTI") self.ui.lbl_stat.setText("Disconnesso") - self.printer.close() - self.printer = None - pass - - def upload(self): - self.sending=True - if self.connected: - if self.ui.rad_dataOn.isChecked(): - date = datetime.datetime.now() - date = date.strftime(self.data["dateformat"]) - else: - date = "" - - cmdstr = "\x02TZ" + self.data["filename"] + ";" + self.data["printmode"] + "\r" - descr = str(self.ui.txt_descr.toPlainText()).capitalize() - print(bytearray(descr,"ascii")) - descr = descr.replace("\n", "\t") - datastr = str(self.ui.txt_model.text()).upper() + "\r" + \ - date + descr + "\r" - outstr = cmdstr + datastr + "\03\r" - self.printer.settimeout(1.0) - try: - self.printer.send(bytearray(outstr, "ascii")) - retval = self.printer.recv(1) - print("ACK: ", retval) - if retval == b'\x06': - retval = self.printer.recv(6) - if retval == b'\x021OK\x03': - print("RESP: ", retval) - self.ui.lbl_stat.setText("Invio Riuscito!") - print("Printer OK") - else: - self.ui.lbl_stat.setText("Invio Fallito!") - print("Printer Error") - else: - print("Send Error") - self.printer.settimeout(0.5) - - self.status() - - if self.headStatus["ink"] == 2: - self.ui.lbl_stat.setText("CARTUCCIA ESAURITA\nSostituire!") - elif self.headStatus["ink"] == 1: - self.ui.lbl_stat.setText("Cartuccia in Esaurimento") - - except socket.error as e: - print("Socket error: ", e) - self.printer.settimeout(0.5) - self.ui.lbl_stat.setText("Invio Fallito!") - self.printer.sendall(b"\r"*5) - self.printer.recv(5) - self.sending = False - pass - - + self.ui.btn_connect.setText("CONNETTI") + self.updateStatusView() + def keepalive(self): - if not self.sending: - print ("Keepalive") - if self.connected: - try: - self.printer.send(b"\x1B*\r") - print(str(self.printer.recv(5))) - self.ui.lbl_stat.setText("Connesso") - if self.inkStatCounter <= self.settings["inkstat"]: - self.inkStatCounter +=1 - else: - self.status() - self.inkStatCounter = 0 - except: - self.disconnetti() - else: - self.ui.lbl_stat.setText("Disconnesso") - pass - - def status(self): - if self.connected: - try: - self.printer.send(b"\x1BS1\r") - time.sleep(1) - c = self.printer.recv(1) - inData = b"" - while c != b"\r": - inData += c - if len(inData) > 200: - print("Status Message Length Error") - raise - c=self.printer.recv(1) - inData = str(inData,"ascii") - inData = inData.split(":") - for val in enumerate(self.data["headstatus"]): - if val[1] != "txt": - self.headStatus[val[1]] = int(inData[val[0]]) - else: - self.headStatus[val[1]] = str(inData[val[0]]) - print("Status: {}".format(self.headStatus)) - self.ui.prg_inkLevel.setValue(self.headStatus["iuse"]) - self.ui.lcd_printCount.display(str(self.headStatus["labelCnt"])) - except: - print("Status retreive error!") - pass - + # TODO: usare il primo argomento di keepalive (stato connessione) per aggiornare la ui + _, statusUpdated = self.printer.keepalive() + if statusUpdated: + self.updateStatusView() + + def upload(self): + if self.ui.rad_dataOn.isChecked(): + date = datetime.datetime.now() + date = date.strftime(self.printer.data["dateformat"]) + else: + date = "" + descr = str(self.ui.txt_descr.toPlainText()).capitalize() + datastr = str(self.ui.txt_model.text()).upper() + "\r" + \ + date + descr + "\r" + response, statusUpdated = self.printer.upload(descr, datastr) + if statusUpdated: + self.updateStatusView() + self.ui.lbl_stat.setText(response) + def quit(self): pass + if __name__ == '__main__': app = PyQt5.QtWidgets.QApplication(sys.argv) - window = main() + configFilePath = "MkpWIFI/conf.json" + window = MainWindow(configFilePath) window.show() sys.exit(app.exec_()) - pass - - diff --git a/MkpWIFI/printer.py b/MkpWIFI/printer.py new file mode 100644 index 0000000..23316b7 --- /dev/null +++ b/MkpWIFI/printer.py @@ -0,0 +1,132 @@ +import socket +import json +import time + + +class MarkoPrinter: + def __init__(self, configFilePath): + self.inkStatCounter = 0 + self.printSock = None + self.headStatus = dict() + self.connected = False + self.sending = False + with open(configFilePath, "r") as setFile: + self.settings = json.load(setFile) + self.data = self.settings["printcmd"] + self.debug = True + + def log(self, *logtxt): + if self.debug: + print(*logtxt) + + def connetti(self): + if not self.connected: + if self.printSock is None: + try: + self.printSock = socket.socket( + socket.AF_INET, socket.SOCK_STREAM) + self.printSock.connect( + (self.settings["ip"], self.settings["port"])) + self.connected = True + self.printSock.settimeout(0.5) + self.checkStatus() + except socket.error as e: + self.printSock = None + self.connected = False + self.log("Connessione Fallita: {}".format(e)) + else: + self.printSock.close() + self.printSock = None + self.connetti() + return self.connected + + def disconnetti(self): + if self.connected: + self.printSock.close() + self.printSock = None + self.connected = False + return self.connected + + def checkStatus(self): + statusUpdated = False + if self.connected: + try: + self.printSock.send(b"\x1BS1\r") + time.sleep(1) + c = self.printSock.recv(1) + inData = b"" + while c != b"\r": + inData += c + if len(inData) > 200: + self.log("Status Message Length Error") + raise IOError + c = self.printSock.recv(1) + inData = str(inData, "ascii") + inData = inData.split(":") + for index, key in enumerate(self.data["headstatus"]): + if key != "txt": + self.headStatus[key] = int(inData[index]) + else: + self.headStatus[key] = str(inData[index]) + self.log("Status: {}".format(self.headStatus)) + statusUpdated = True + except: + self.log("Status retreive error!") + return statusUpdated + + def upload(self, descr, datastr): + self.sending = True + response = "" + if self.connected: + cmdstr = "\x02TZ" + self.data["filename"] + \ + ";" + self.data["printmode"] + "\r" + self.log(bytearray(descr, "ascii")) + descr = descr.replace("\n", "\t") + outstr = cmdstr + datastr + "\03\r" + self.printSock.settimeout(1.0) + try: + self.printSock.send(bytearray(outstr, "ascii")) + retval = self.printSock.recv(1) + self.log("ACK: ", retval) + if retval == b'\x06': + retval = self.printSock.recv(6) + if retval == b'\x021OK\x03': + self.log("RESP: ", retval) + response = "Invio Riuscito!" + self.log("Printer OK") + else: + response = "Invio Fallito!" + self.log("Printer Error") + else: + self.log("Send Error") + self.printSock.settimeout(0.5) + statusUpdated = self.checkStatus() + if self.headStatus["ink"] == 2: + response = "CARTUCCIA ESAURITA\nSostituire!" + elif self.headStatus["ink"] == 1: + response = "Cartuccia in Esaurimento" + except socket.error as e: + self.log("Socket error: ", e) + self.printSock.settimeout(0.5) + response = "Invio Fallito!" + self.printSock.sendall(b"\r"*5) + self.printSock.recv(5) + self.sending = False + return response, statusUpdated + + def keepalive(self): + statusUpdated = False + if not self.sending: + self.log("Keepalive") + if self.connected: + try: + self.printSock.send(b"\x1B*\r") + self.log(str(self.printSock.recv(5))) + if self.inkStatCounter <= self.settings["inkstat"]: + self.inkStatCounter += 1 + else: + statusUpdated = self.checkStatus() + self.inkStatCounter = 0 + except: + self.disconnetti() + return self.connected, statusUpdated