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
master
Emanuele Trabattoni 2019-09-30 12:59:14 +02:00
parent dcd2774336
commit 206bb29334
2 changed files with 60 additions and 20 deletions

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:
try:
if lastAck == True:
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))
LOGGER.debug('SENT: {}'.format(subChars(commandString)))
lastAck = False
else:
r=printer.readResponse('callPrintImage')
LOGGER.debug('RECEIVED: {}'.format(r))
protocol.checkResponse('callPrintImage',r)
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,6 +127,7 @@ 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))
@ -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: