''' Created on 19 mar 2020 @author: Emanuele Trabattoni ''' import queue, time, socket, logging from driver.tsc_commands import TSC_COMMANDS, TSC_STATUS, LINE_SEP from driver.notifier import URL_ERR, URL_EVENT, URL_RESPONSE, send_response import traceback SOCK_TIMEOUT = 2 ENC = 'ascii' def tsc_printer(q_in: queue.Queue, q_out: queue.Queue, q_cmd: queue.Queue, ip: str, port: int, logger: logging.getLogger): prt = None def read_until(term): buf = bytearray() c=prt.recv(1) while c != term: buf = buf+c c = prt.recv(1) return buf def send_file(name=None, content=None, ftype=None): nonlocal prt if ftype == 'batch': to_send = TSC_COMMANDS['DOWNLOAD'].format(location='F,', name=f'"{name}"', content=LINE_SEP+content.join(LINE_SEP)+LINE_SEP) elif ftype == 'data': data = content.join(LINE_SEP)+LINE_SEP to_send = TSC_COMMANDS['DOWNLOAD'].format(name=f'"{name}"',size=','+len(data),content=data) prt.send_all(bytearray(to_send, encoding=ENC)) pass def delete_file(name=None): nonlocal prt if ".BAS" in name: to_send = TSC_COMMANDS['REMOVE'].format(location='F,', name=f'"{name}"') else: to_send = TSC_COMMANDS['REMOVE'].format(name=f'"{name}"') prt.sendall(bytearray(to_send+LINE_SEP, encoding=ENC)) pass def move_file(name=None): #per default muove i file dalla RAM alla FLASH nonlocal prt to_send = TSC_COMMANDS['MOVE'].format(name=f'"{name}"') prt.sendall(bytearray(to_send+LINE_SEP, encoding=ENC)) pass def list_files(): nonlocal prt prt.sendall(bytearray(TSC_COMMANDS['LIST']+LINE_SEP, encoding="utf-8")) time.sleep(0.1) retval = read_until(b'\x1A').decode(ENC).split('\r') logger.info(f"Risposta: {retval}") send_response(q_out, ip, "LIST",{"lista_file": retval}) pass def printer_info(): nonlocal prt prt.sendall(bytearray(TSC_COMMANDS['PAUSE'], encoding=ENC)) pass def printer_usage(): nonlocal prt prt.sendall(bytearray(TSC_COMMANDS['USE'], encoding=ENC)) pass def printer_pause(): nonlocal prt prt.sendall(bytearray(b'\x1B'+TSC_COMMANDS['PAUSE'], encoding=ENC)) pass def printer_resume(): nonlocal prt prt.sendall(bytearray(b'\x1B'+TSC_COMMANDS['RESUME'], encoding=ENC)) pass def clear_memory(): nonlocal prt prt.sendall(bytearray(b'\x1B'+TSC_COMMANDS['CLEAR'], encoding=ENC)) pass def run_batch(name=None): nonlocal prt to_send = TSC_COMMANDS['RUN'].format(name=f'"{name}"') prt.sendall(bytearray(to_send+LINE_SEP, encoding=ENC)) pass def get_status(): nonlocal prt prt.sendall(bytearray(b'\x1B'+TSC_COMMANDS['STATUS'], encoding=ENC)) time.sleep(0.1) return TSC_STATUS[int(prt.recv(1))] while True: # connetti mantieni vivo il socket try: with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as prt: prt.connect((ip, port)) while True: itm = q_in.get(block=True) cmd = itm['name'] par = itm['parameters'] if cmd == 'DOWNLOAD': send_file(**par) pass elif cmd == 'REMOVE': delete_file(**par) pass elif cmd == 'MOVE': move_file(**par) pass elif cmd == 'LIST': list_files() pass elif cmd == 'INFO': printer_info() pass elif cmd == 'USE': printer_usage() pass elif cmd == 'PAUSE': printer_pause() pass elif cmd == 'RESUME': printer_resume() pass elif cmd == 'CLEAR': clear_memory() pass elif cmd == 'RUN': run_batch(**par) pass elif cmd == 'STATUS': get_status() pass else: logger.error("Comando stampante non riconosciuto") except socket.timeout as st: logger.error(f"Stampante {__name__} irraggiungibile:{st}") prt.close() del prt except socket.error as se: logger.error(f"Errore generico stamoante {__name__}: {se}") prt.close() del prt except Exception as e: traceback.print_exc() logger.error("Errore generale inizializzando la stampante: {}".format(e)) pass