import logging from venv import logger from escpos.printer.win32raw import Win32Raw from escpos.printer.usb import Usb from escpos.printer.network import Network from escpos.printer import Dummy from escpos.escpos import Escpos from impresora.order import Order import usb.core logger = logging.getLogger(__name__) class BasePrinter: def __init__(self): self.bolded = False self.font = "a" self.doubled_size = False self.work = Dummy() self.printer:Escpos def is_connected(self): return self.printer.is_online() def change_font(self): self.font = "b" if self.font == "a" else "a" self.work.set(font=self.font) def text(self, text): # Print the text self.work.text(text+"\n") def bold(self): # Set bold for the next print self.bolded = not self.bolded self.work.set(bold=self.bolded) def double_size(self): # Set double size for the next print self.doubled_size = not self.doubled_size self.work.set(double_height=self.doubled_size, double_width=self.doubled_size) def default(self): # Set default size for the next print self.work.set_with_default() def print_order(self, order:Order, mesa:int = 0): # Print the order details self.default() self.double_size() self.bold() self.text(f"Orden Biergarten Klein\n") self.default() self.text(f"Fecha: {order.date.strftime('%d/%m/%Y: %H:%M:%S')}") self.bold() self.text(f"Mesa: {mesa}") self.text(f"Cliente: {order.user}\n") self.default() self.text(order.tabulate()) self.bold() self.text(f"Total: {order.total}") self.work.cut() # Print the order details self.printer._raw(self.work.output) self.work.clear() # Intentar cerrar la impresora si el método existe if hasattr(self.printer, 'close'): self.printer.close() class PrinterWindows(BasePrinter): def __init__(self, printer_name="Impresora Termica"): super().__init__() self.printer = Win32Raw(printer_name) class PrinterUSB(BasePrinter): def __init__(self, vendor_id, product_id): super().__init__() self.printer = Usb(vendor_id, product_id,in_ep=0x81,out_ep=0x03) self.vendor_id = vendor_id self.product_id = product_id @staticmethod def check_usb_port(vendor_id, product_id): """Check if the USB printer is connected.""" try: element = usb.core.find(idVendor=vendor_id, idProduct=product_id) if element is None: logger.error(f"Printer is not connected on USB port {vendor_id}:{product_id}.") return False return True except Exception as e: logger.error(f"Error checking USB printer: {e}") return False def is_connected(self): """Check if the USB printer is connected.""" return self.check_usb_port(self.vendor_id, self.product_id) class PrinterNetwork(BasePrinter): def __init__(self, host, port): super().__init__() self.printer = Network(host, port)