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
'end': '\x03', # ETX
'command': 'TZ{imageName};{printMode};{queueNo};{delay}\r{fieldContent}\r{counterStart}',
'success': '\x06\x02([0-9])OK\x03',
'error': '([0-9])E([0-9])',
'success': '([0-9]OK)',
'error': '([0-9]E[0-9])',
'args': ['imageName', 'printMode', 'fieldContent'],
'optArgs': ['queueNo', 'delay', 'counterStart']
},

View File

@ -3,7 +3,7 @@
"port": 8899,
"name": "MKPsouplesse",
"autoconnect": true,
"keepalive": 5000,
"keepalive": 5.0,
"timeout": 0.5,
"inkstat": 2,
"printcmd": {

View File

@ -6,6 +6,29 @@ Created on Sat Sep 28 11:41:21 2019
@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 printer as p
import logging
import socket
import protocol
def main():
isRunning = True
lastAck = True
while isRunning:
printer = p.MarkoPrinter('./conf.json', LOGGER)
connessa = printer.connetti()
printer.sendCommand(protocol.deleteMemory())
while connessa:
lastTimestamp = int(time.time()*100)
commandString = protocol.callPrintImage(imageName='TM2.00I',
printMode='10',
fieldContent='{0}\r{0}'.format(lastTimestamp))
try:
printer.sendCommand(commandString)
LOGGER.debug('SENT: {}'.format(commandString))
r=printer.readResponse('callPrintImage')
LOGGER.debug('RECEIVED: {}'.format(r))
protocol.checkResponse('callPrintImage',r)
if lastAck == True:
lastTimestamp = int(time.time()*100)
commandString = protocol.callPrintImage(imageName='TM2.00I',
printMode='10',
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:
LOGGER.error(str(e))
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__':
# Setup Logger
LOGGER = logging.getLogger(__name__)

View File

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

View File

@ -40,9 +40,9 @@ def _cmdString(cmdName, **cmdArgs):
def _checkError(cmdName, response):
errKey = 'error'
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
error_codes = re.match(cmdDict[errKey], response, re.I)
error_codes = re.search(cmdDict[errKey], response, re.I)
if error_codes:
return error_codes.groups()
return None
@ -57,7 +57,7 @@ def checkResponse(cmdName, response):
return None
else:
return error
if re.match(cmdDict[sucKey], response, re.I):
if re.search(cmdDict[sucKey], response, re.I):
return True
error = _checkError(cmdName, response)
if error is None: