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 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:
try:
if lastAck == True:
lastTimestamp = int(time.time()*100) lastTimestamp = int(time.time()*100)
commandString = protocol.callPrintImage(imageName='TM2.00I', commandString = protocol.callPrintImage(imageName='TM2.00I',
printMode='10', printMode='10',
fieldContent='{0}\r{0}'.format(lastTimestamp)) fieldContent='{0}\r{0}'.format(lastTimestamp))
try:
printer.sendCommand(commandString) printer.sendCommand(commandString)
LOGGER.debug('SENT: {}'.format(commandString)) LOGGER.debug('SENT: {}'.format(subChars(commandString)))
lastAck = False
else:
r=printer.readResponse('callPrintImage') r=printer.readResponse('callPrintImage')
LOGGER.debug('RECEIVED: {}'.format(r)) LOGGER.debug('RECEIVED: {}'.format(subChars(r)))
protocol.checkResponse('callPrintImage',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,6 +127,7 @@ 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))
@ -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: