Compare commits

...

3 Commits

Author SHA1 Message Date
Emanuele Trabattoni d87eb7a22b roba non importante 2019-09-30 12:59:46 +02:00
Emanuele Trabattoni 206bb29334 Modifiche a main e printer per rendere possibile l'invio di keepalive
anche quando si è  in attesa di una risposta di stampa avvenuta o di un
errore: sfrutta il timeout del socket.
Non robustissimo ma funziona
2019-09-30 12:59:14 +02:00
Emanuele Trabattoni dcd2774336 Corretto il match delle stinge per la risposta di successo o errore:
re.search() invece di re.match() ed eliminati i caratteri speciali del
pattern da cercare
2019-09-30 11:01:25 +02:00
7 changed files with 93517 additions and 60 deletions

View File

@ -45,8 +45,8 @@ MKPcommands = {
'begin': '\x02', # STX 'begin': '\x02', # STX
'end': '\x03', # ETX 'end': '\x03', # ETX
'command': 'TZ{imageName};{printMode};{queueNo};{delay}\r{fieldContent}\r{counterStart}', 'command': 'TZ{imageName};{printMode};{queueNo};{delay}\r{fieldContent}\r{counterStart}',
'success': '\x06\x02([0-9])OK\x03', 'success': '([0-9]OK)',
'error': '([0-9])E([0-9])', 'error': '([0-9]E[0-9])',
'args': ['imageName', 'printMode', 'fieldContent'], 'args': ['imageName', 'printMode', 'fieldContent'],
'optArgs': ['queueNo', 'delay', 'counterStart'] 'optArgs': ['queueNo', 'delay', 'counterStart']
}, },

View File

@ -1,33 +1,33 @@
{ {
"ip": "192.168.40.30", "ip": "192.168.40.30",
"port": 8899, "port": 8899,
"name": "MKPsouplesse", "name": "MKPsouplesse",
"autoconnect": true, "autoconnect": true,
"keepalive": 5000, "keepalive": 5.0,
"timeout": 0.5, "timeout": 0.5,
"inkstat": 2, "inkstat": 2,
"printcmd": { "printcmd": {
"filename": "TM1.00I", "filename": "TM1.00I",
"dateformat": "%d%m%y-", "dateformat": "%d%m%y-",
"handshake": "*", "handshake": "*",
"printmode": "11", "printmode": "11",
"headstatus": [ "headstatus": [
"ink", "ink",
"htmr", "htmr",
"iuse", "iuse",
"xclk", "xclk",
"bat", "bat",
"txt", "txt",
"pause", "pause",
"headOk", "headOk",
"headTyp", "headTyp",
"labelCnt", "labelCnt",
"ztv", "ztv",
"cp", "cp",
"lx", "lx",
"exInk", "exInk",
"scStat", "scStat",
"inkStat" "inkStat"
] ]
} }
} }

View File

@ -6,6 +6,29 @@ Created on Sat Sep 28 11:41:21 2019
@author: Guido Longoni - guidolongoni@gmail.com @author: Guido Longoni - guidolongoni@gmail.com
""" """
import protocol as p #import protocol as p
testala=p.callPrintImage(imageName='Pippus',printMode='10',fieldContent='qualcosa\rqualcosaltro\rciao') #testala=p.callPrintImage(imageName='Pippus',printMode='10',fieldContent='qualcosa\rqualcosaltro\rciao')
def subChars(s):
subDict = {'\x02': " #STX ",
'\x03': " #ETX ",
'\x1B': " #ESC ",
'\r': " #CR ",
'\f': " #LF ",
'\t': " #TAB ",
'\x06': " #ACK ",
'\x15': " #NACK "
}
out = ""
for c in s:
if c in subDict.keys():
out += subDict[c]
else:
out += c
return out
t="\x06\x02OK\x03\r\n\t"
print(subChars(t))

File diff suppressed because it is too large Load Diff

View File

@ -7,30 +7,63 @@ import time
import sys import sys
import printer as p import printer as p
import logging import logging
import socket
import protocol import protocol
def main(): def main():
isRunning = True isRunning = True
lastAck = True
while isRunning: while isRunning:
printer = p.MarkoPrinter('./conf.json', LOGGER) printer = p.MarkoPrinter('./conf.json', LOGGER)
connessa = printer.connetti() connessa = printer.connetti()
printer.sendCommand(protocol.deleteMemory())
while connessa: while connessa:
lastTimestamp = int(time.time()*100)
commandString = protocol.callPrintImage(imageName='TM2.00I',
printMode='10',
fieldContent='{0}\r{0}'.format(lastTimestamp))
try: try:
printer.sendCommand(commandString) if lastAck == True:
LOGGER.debug('SENT: {}'.format(commandString)) lastTimestamp = int(time.time()*100)
r=printer.readResponse('callPrintImage') commandString = protocol.callPrintImage(imageName='TM2.00I',
LOGGER.debug('RECEIVED: {}'.format(r)) printMode='10',
protocol.checkResponse('callPrintImage',r) fieldContent='{0}\r{0}'.format(lastTimestamp))
printer.sendCommand(commandString)
LOGGER.debug('SENT: {}'.format(subChars(commandString)))
lastAck = False
else:
r=printer.readResponse('callPrintImage')
LOGGER.debug('RECEIVED: {}'.format(subChars(r)))
if protocol.checkResponse('callPrintImage',r):
LOGGER.info("Stampa Riuscita: {}".format(lastTimestamp))
else:
LOGGER.error("Stampa Fallita: {}".format(lastTimestamp))
lastAck = True
except socket.timeout as t:
LOGGER.debug("Timeout stampa")
lastAck = False
printer.keepalive()
pass
except Exception as e: except Exception as e:
LOGGER.error(str(e)) LOGGER.error(str(e))
pass pass
pass pass
pass pass
def subChars(s):
subDict = {'\x02': " #STX ",
'\x03': " #ETX ",
'\x1B': " #ESC ",
'\r': " #CR ",
'\f': " #LF ",
'\t': " #TAB ",
'\x06': " #ACK ",
'\x15': " #NACK "
}
out = ""
for c in s:
if c in subDict.keys():
out += subDict[c]
else:
out += c
return out
if __name__ == '__main__': if __name__ == '__main__':
# Setup Logger # Setup Logger
LOGGER = logging.getLogger(__name__) LOGGER = logging.getLogger(__name__)

View File

@ -2,6 +2,7 @@ import socket
import json import json
import time import time
import protocol import protocol
import threading
import commands as cmd import commands as cmd
class MarkoPrinter: class MarkoPrinter:
@ -33,11 +34,13 @@ class MarkoPrinter:
self.connected = True self.connected = True
self.printSock.settimeout(0.5) self.printSock.settimeout(0.5)
self.checkStatus() self.checkStatus()
self.LOGGER.debug("Connessione Riuscita")
except socket.error as e: except socket.error as e:
self.printSock = None self.printSock = None
self.connected = False self.connected = False
self.log("Connessione Fallita: {}".format(e)) self.LOGGER.debug("Connessione Fallita: {}".format(e))
else: else:
self.keepaliveTimer.cancel()
self.printSock.close() self.printSock.close()
self.printSock = None self.printSock = None
self.connetti() self.connetti()
@ -61,7 +64,7 @@ class MarkoPrinter:
while c != b"\r": while c != b"\r":
inData += c inData += c
if len(inData) > 200: if len(inData) > 200:
self.log("Status Message Length Error") self.LOGGER.error("Status Message Length Error")
raise IOError raise IOError
c = self.printSock.recv(1) c = self.printSock.recv(1)
inData = str(inData, "ascii") inData = str(inData, "ascii")
@ -71,10 +74,10 @@ class MarkoPrinter:
self.headStatus[key] = int(inData[index]) self.headStatus[key] = int(inData[index])
else: else:
self.headStatus[key] = str(inData[index]) self.headStatus[key] = str(inData[index])
self.log("Status: {}".format(self.headStatus)) self.LOGGER.info("Status: {}".format(self.headStatus))
statusUpdated = True statusUpdated = True
except: except:
self.log("Status retreive error!") self.LOGGER.error("Status retreive error!")
return statusUpdated return statusUpdated
def upload(self, descr, datastr): def upload(self, descr, datastr):
@ -124,11 +127,12 @@ class MarkoPrinter:
self.printSock.settimeout(1.0) self.printSock.settimeout(1.0)
self.printSock.send(bytearray(c,'ascii')) self.printSock.send(bytearray(c,'ascii'))
self.printSock.settimeout(0.5) self.printSock.settimeout(0.5)
self.sending = False
return True return True
except socket.error as e: except socket.error as e:
self.LOGGER.error('Socket Error: {}'.format(e)) self.LOGGER.error('Socket Error: {}'.format(e))
return False return False
self.sending = False self.sending = False
pass pass
def readResponse(self, c): def readResponse(self, c):
@ -137,17 +141,20 @@ class MarkoPrinter:
respTerm = cmd.DEFprefix['end'] if cmd.MKPcommands[c]['defPrefix'] else cmd.MKPcommands[c]['end'] respTerm = cmd.DEFprefix['end'] if cmd.MKPcommands[c]['defPrefix'] else cmd.MKPcommands[c]['end']
if self.connected: if self.connected:
try: try:
self.printSock.settimeout(1.0) # lettura bloccante del socket in attesa di conferma
self.printSock.setblocking(True) self.printSock.settimeout(5)
c = self.printSock.recv(1) c = self.printSock.recv(1)
while c != respTerm: while c != respTerm:
buf += c buf += c
if str(c, 'ascii') == respTerm: if str(c, 'ascii') == respTerm:
break break
c = self.printSock.recv(1) c = self.printSock.recv(1)
# disattivo lettura bloccante
self.printSock.settimeout(0.5) self.printSock.settimeout(0.5)
self.printSock.setblocking(False)
return str(buf, 'ascii') return str(buf, 'ascii')
except socket.timeout as t:
self.reading = False
raise t
except socket.error as e: except socket.error as e:
self.LOGGER.error('Socket Error: {}'.format(e)) self.LOGGER.error('Socket Error: {}'.format(e))
return False return False
@ -156,12 +163,12 @@ class MarkoPrinter:
def keepalive(self): def keepalive(self):
statusUpdated = False statusUpdated = False
if not self.sending: self.LOGGER.debug("Keepalive")
self.log("Keepalive") if not self.sending and not self.reading:
if self.connected: if self.connected:
try: try:
self.printSock.send(b"\x1B*\r") self.printSock.send(b"\x1B*\r")
self.log(str(self.printSock.recv(5))) self.LOGGER.debug(str(self.printSock.recv(5)))
if self.inkStatCounter <= self.settings["inkstat"]: if self.inkStatCounter <= self.settings["inkstat"]:
self.inkStatCounter += 1 self.inkStatCounter += 1
else: else:

View File

@ -40,9 +40,9 @@ def _cmdString(cmdName, **cmdArgs):
def _checkError(cmdName, response): def _checkError(cmdName, response):
errKey = 'error' errKey = 'error'
cmdDict = cmd.MKPcommands[cmdName] cmdDict = cmd.MKPcommands[cmdName]
if errKey in cmdDict and cmdDict[errKey] is not None: if errKey in cmdDict and cmdDict[errKey] is None:
return None return None
error_codes = re.match(cmdDict[errKey], response, re.I) error_codes = re.search(cmdDict[errKey], response, re.I)
if error_codes: if error_codes:
return error_codes.groups() return error_codes.groups()
return None return None
@ -57,7 +57,7 @@ def checkResponse(cmdName, response):
return None return None
else: else:
return error return error
if re.match(cmdDict[sucKey], response, re.I): if re.search(cmdDict[sucKey], response, re.I):
return True return True
error = _checkError(cmdName, response) error = _checkError(cmdName, response)
if error is None: if error is None: