ti_printer_plugin 1.1.1 copy "ti_printer_plugin: ^1.1.1" to clipboard
ti_printer_plugin: ^1.1.1 copied to clipboard

Plugin Flutter para imprimir y consultar estado en impresoras térmicas ESC/POS por USB, ideal para POS y self-checkout en Linux/Windows.

1.1.1 #

  • DLE EOT para impresoras sin ASB (RPT006B, RPT008):

    • Nuevo polling cíclico DLE EOT (1→2→1→4) para modelos que responden solo a comandos de estado individuales.
    • Las impresoras se detectan automáticamente por VID/PID y usan DLE EOT en lugar de ASB.
    • Los badges de estado (Online, Tapa, Papel) se actualizan en tiempo real desde las respuestas DLE EOT.
    • Ya no se depende del bit de off-line de EOT 1 ni del estado de la gaveta/cajón para determinar Online; se usa EOT 2 (causas off-line) y EOT 4 (papel).
  • Corrección Windows (ReadUsbPacketWithTimeout):

    • Se reemite la lectura overlapped cuando ReadFile retorna TRUE con bytes_read=0, evitando pérdida de respuestas en RPT006B.

1.1.0 #

  • Nuevo soporte ASB (Automatic Status Back):

    • Se agregan los métodos readFromUsb(), enableAsb() y disableAsb() en las capas Dart y nativas.
    • enableAsb() envía GS a 0x0F para activar el envío automático de estado por parte de la impresora.
    • disableAsb() envía GS a 0x00 para desactivarlo.
    • readFromUsb() realiza una lectura directa del endpoint IN sin escribir un comando previo, ideal para capturar las respuestas ASB.
    • Windows: Se agrega detección de dispositivos con servicio winusb además de usbprint en ListUsbInstance().
    • Linux: Se incorporan las operaciones USB_OP_READ_FROM_USB, USB_OP_ENABLE_ASB y USB_OP_DISABLE_ASB en el worker de I/O.
  • Nuevo método sendAndReadStatusUsb():

    • Envía un comando ESC/POS y lee la respuesta en una sola operación atómica desde Dart.
    • Implementado en Windows (como SendAndReadStatus / SendAndReadStatusDetailed) y Linux (como USB_OP_SEND_AND_READ_STATUS).
  • Nuevo método readStatusUsbDetailed() y modelo UsbStatusReadResult:

    • readStatusUsbDetailed(Uint8List command) devuelve UsbStatusReadResult con un campo kind (enum UsbStatusReadKind) que clasifica el resultado en: success, timeoutOrNoResponse, discardedAsb, discardedAmbiguousPayload o transportError.
    • Reemplaza el antiguo comportamiento de "devolver Uint8List vacío para todo" con información diagnóstica estructurada.
    • El método readStatusUsb() existente ahora delega internamente en readStatusUsbDetailed() para mantener compatibilidad.
  • Refactor mayor de Windows (ti_printer_plugin.cpp):

    • Nuevos helpers reutilizables para operaciones overlapped: WriteUsbChunkWithTimeout(), ReadUsbPacketWithTimeout(), ClassifyStatusPayload(), ScopedKernelHandle, ScopedIoReservation, CloseUsbHandleBestEffort().
    • ReadStatusUsb() reimplementado con clasificación de payloads: reintenta hasta 3 veces filtrando paquetes ASB que caen en ventanas de lectura DLE EOT.
    • WriteStatusCommand() refactorizado a usar WriteUsbChunkWithTimeout().
    • FlushUsbReadBuffer() refactorizado a usar ReadUsbPacketWithTimeout().
    • CloseUsbPortInternal() extraído como método separado de CloseUsbPort().
    • Eliminados logs excesivos de depuración y comentarios redundantes.
    • CMAKE_POLICY_VERSION_MINIMUM subido de 3.5 a 3.10.
  • Linux (ti_printer_plugin.cc):

    • Se agrega read_from_usb() como wrapper de read_status_usb() con comando vacío.
    • Nuevas operaciones en el worker: USB_OP_READ_FROM_USB, USB_OP_SEND_AND_READ_STATUS, USB_OP_ENABLE_ASB, USB_OP_DISABLE_ASB.
    • Se implementa el manejo de los nuevos métodos readFromUsb, sendAndReadStatusUsb, enableAsb y disableAsb en el dispatcher.
  • Example app reestructurada completamente:

    • Nueva app AsbValidationApp con página AsbValidationPage diseñada para validar ASB y reconexión USB en tiempo real.
    • Reemplaza la antigua PrinterStatusView y PrinterController.
    • Incluye monitoreo ASB vía readFromUsb() en loop, reconexión automática al detectar desconexión física, polling activo como fallback cuando ASB no está disponible, y visualización de paquetes ASB de 4 bytes.
    • Nuevos widgets: AsbStatus, ActionChip, Badge, ConnState, EscPosCommands, StatusBadgesRow, StatusBanner.
    • Item movido de ui/item.dart a logic/item.dart.
    • PrinterState actualizado con nuevos campos: lastResponse, asbEnabled.
    • PrinterStatusInterpreter extendido con describeAsbPacket() e interpretAsbPacket().
    • Tests actualizados para la nueva UI.
  • Plugin tests:

    • Nuevos tests unitarios para readStatusUsbDetailed().
    • Mock de plataforma actualizado con implementaciones de enableAsb, disableAsb, readFromUsb, sendAndReadStatusUsb.

1.0.17 #

  • Windows - Estado USB realtime mas estricto:

    • readStatusUsb() ahora filtra respuestas de DLE EOT 1/2/4 y solo acepta payloads coherentes de 1 byte. Si llega un bloque mezclado o acumulado, se descarta en lugar de propagar bytes contaminados a Dart.
    • Se agregan trazas de debug para distinguir timeout, payload invalido y payload filtrado.
  • Example - Monitor USB sin carreras al abrir/cerrar:

    • printer_controller.dart: startUsbAutoMonitor() ahora usa una sesion/token de monitor para evitar arranques duplicados mientras hay await en curso.
    • stopUsbMonitor() invalida callbacks/timers pendientes y evita que sigan consultando estado despues de cerrar el puerto.
    • _pollUsbStatusOnce() ya no consulta estado si isUsbOpen == false.
    • closeUsbPort() deja la UI USB en isUsbOpen=false y enLineaUsb=false al cerrar.
  • Example - Logica de monitoreo mejorada:

    • Stall detection: _applyUsbStatusResponses() detecta endpoint stall USB cuando DLE EOT 1 tiene exito pero DLE EOT 2 esta vacio (comportamiento de Epson TM-T88V al abrir la tapa), seteando offline + tapa abierta inmediatamente sin esperar el contador de timeouts.
    • Skip de DLE EOT 2 refinado: Cuando DLE EOT 1 dice online y toda la secuencia responde (EOT 1-4 con datos), se ignora DLE EOT 2 para evitar falsos positivos de tapa abierta. Si DLE EOT 3 o 4 estan vacios (stall tardio), se procesa DLE EOT 2 porque fue escrito antes del stall y su dato es valido.
    • Error en polling reflejado en estado: _pollUsbStatusOnce() actualiza enLineaUsb: false en el estado cuando falla la consulta.
    • Logs acotados: _addLog() limita la lista a 500 entradas maximas.
    • Ticket sin parametro total redundante: Se removio total de buildTicket/printUsbTicket porque se recalcula desde los items. Ahora muestra Efectivo recibido y Cambio en el ticket impreso.
  • Example - Directorio uils/ renombrado a utils/:

    • Correccion del typo en el nombre del directorio y actualizacion de imports.
  • Linux — I/O USB fuera del main thread (fix congelamiento de UI):

    • Todo el I/O de dispositivo (getUsbPrinters, openUsbPort, closeUsbPort, sendCommandToUsb, readStatusUsb) corre ahora en un pool de un solo thread (FIFO) con respuesta asíncrona vía g_idle_add. Una impresora en BUSY ya no puede congelar la UI.
    • open() con O_NONBLOCK | O_NOCTTY (antes estaba comentado): ni open() ni write() pueden bloquear indefinidamente; O_NOCTTY evita que un ttyUSB/ttyACM capture la terminal del proceso.
    • Escrituras acotadas con poll(POLLOUT) + deadline (5s datos / 1s comandos de estado): si la impresora no acepta datos, se responde error en lugar de colgar.
  • Linux — Drain de input antes de comandos de estado (fix respuestas contaminadas):

    • readStatusUsb descarta bytes viejos del buffer del kernel (respuestas que llegaron después del timeout) antes de enviar el nuevo comando DLE EOT. Es la causa raíz que 1.0.15 mitigaba con status.last y gaps de 80ms.
  • Linux — Limpieza:

    • Eliminado fsync() sobre character devices (devolvía EINVAL, ignorado).
  • Dart — Parseo defensivo del listado USB:

    • PrinterDeviceInfo.fromMap ya no crashea con claves faltantes o tipos inesperados; getUsbPrinters descarta entradas malformadas (sin instanceId) en lugar de propagar excepciones de cast.

1.0.16 #

  • Windows — Corrección listado + apertura de impresoras USB:

    • ListUsbInstance(): En la segunda pasada (clase Printer), ahora agrega también el dispositivo padre USB (CM_Get_Parent) de cada impresora encontrada. Así se listan tanto el nodo raw USB\VID_... como el nodo lógico USBPRINT\....
    • OpenUsbPort(): Cuando recibe un instanceId de tipo USBPRINT\..., lo resuelve a su padre USB raw recorriendo el árbol de dispositivos (GUID_DEVCLASS_PRINTER + CM_Get_Parent), y abre ese raw USB device — el único que soporta I/O raw ESC/POS.
    • Nueva constante GUID_DEVINTERFACE_USBPRINT para identificación de interfaces de impresora USB.
  • Base de datos de impresoras:

    • database_printer.dart: Agregado PID 0x0E02EPSON TM-T88V.
  • Ejemplo — Monitoreo automático al reabrir puerto:

    • printer_controller.dart: openSelectedUsb() ahora llama a startUsbAutoMonitor(skipOpen: true) tras abrir exitosamente, reiniciando el monitoreo periódico aunque se haya detenido previamente.
    • startUsbAutoMonitor(): Nuevo parámetro skipOpen para saltar la apertura cuando el puerto ya está abierto.

1.0.15 #

  • Corrección en interpretación de estado USB:

    • printer_status_interpreter.dart: Cambia status[0]status.last para manejar impresoras que devuelven bytes acumulados de consultas anteriores.
    • printer_controller.dart: Agrega pausa de 80ms (_usbStatusCommandGap) entre comandos DLE EOT en USB para evitar superposición de respuestas.
  • Corrección apertura puerto USB en Windows:

    • ti_printer_plugin.cpp: Pasa &devInfoData directamente a SetupDiGetDeviceInterfaceDetail eliminando llamada redundante a SetupDiEnumDeviceInfo.

1.0.14 #

  • Carga correcta de CapabilityProfile desde assets del paquete:

    • CapabilityProfile.load() y CapabilityProfile.getAvailableProfiles() ahora resuelven capabilities.json usando la clave de asset del paquete packages/ti_printer_plugin/assets/resources/capabilities.json.
    • La app consumidora ya no necesita declarar ni copiar assets/resources/capabilities.json en su propio pubspec.yaml.
    • Agregada prueba unitaria para validar la carga del perfil y el listado de perfiles usando un mock del canal de assets.
  • Ejemplo desacoplado de internals:

    • example/lib/logic/printer_controller.dart y example/lib/logic/ticket_builder.dart ahora importan package:ti_printer_plugin/esc_pos_utils_platform/esc_pos_utils_platform.dart en lugar de rutas src/....
    • La documentación aclara que el barrel público es la forma recomendada de consumir la librería ESC/POS incluida en el plugin.

1.0.13 #

  • Reestructuración de directorios:
    • La librería esc_pos_utils_platform se movió de example/lib/ a lib/ (raíz del plugin), junto con assets/resources/capabilities.json.
    • Actualizadas todas las importaciones en la app de ejemplo para usar package:ti_printer_plugin/....
    • El plugin ahora incluye la librería ESC/POS como parte de su propia API.

1.0.12 #

  • API breaking: getUsbPrinters() ahora retorna List<PrinterDeviceInfo> en lugar de List<String>:

    • Nuevo modelo PrinterDeviceInfo con instanceId, displayName, vid, pid.
    • openUsbPort() ahora requiere device.instanceId en vez del string directo.
    • PrinterDeviceInfo.resolvedDisplayName: getter que busca el VID/PID en la base de datos de impresoras conocidas y retorna un nombre legible.
    • Parseo de VID/PID desde el instanceId nativo (formato USB\VID_xxxx&PID_xxxx\...).
  • Nuevo lib/database_printer.dart:

    • Clase KnownUsbPrinter y lista knownThermalUsbPrinters con +30 entradas (Epson, Star, Bixolon, Citizen, Zebra, TSC, DYMO, genéricas POS58/POS80, Gprinter, Rongta).
    • Función lookupPrinterInfo(vid, pid) para búsqueda programática.
    • Exportado desde ti_printer_plugin.dart.
  • Windows ListUsbInstance() — PLG-16 (Camino A + B):

    • Camino A: Segunda pasada con GUID_DEVCLASS_PRINTER para capturar impresoras con drivers propietarios (Epson, Star, Bixolon), con dedup contra la primera pasada.
    • Camino B: Retorna vector<PrinterDeviceInfo> con instanceId, displayName, vid, pid.
    • Helpers estáticos reemplazados por lambdas inline para eliminar posibles bugs de linking.
    • OutputDebugStringA agregado para depurar fallos de SetupDiGetClassDevs y CM_Get_Device_ID.
  • Linux list_usb_printers() — PLG-18 (VID/PID desde sysfs):

    • Nuevas funciones helper resolve_sysfs_path() y read_vid_pid_from_sysfs().
    • Cada dispositivo ahora resuelve VID/PID real recorriendo /sys/dev/char/<major>:<minor> y caminando hacia arriba en el árbol sysfs hasta encontrar idVendor/idProduct.
    • displayName se genera como "USB Printer (VID:0xPPPP, PID:0xPPPP)" si se encontraron VID/PID.
    • Sin dependencias externas (solo POSIX: stat, realpath, ifstream, snprintf).
  • Reestructuración del plugin:

    • La librería esc_pos_utils_platform se movió del plugin (lib/) a la app de ejemplo (example/lib/). El plugin ahora es más liviano y solo contiene la capa de comunicación nativa.
    • Se eliminaron dependencias y archivos no utilizados del plugin.
  • API simplificada (Dart + nativo) — PLG-14:

    • readStatusUsb(Uint8List command) y readStatusSerial(Uint8List command) ahora aceptan Uint8List directamente (ya no requiere Map {"command": ...}).
    • Actualizados lib/ti_printer_plugin_method_channel.dart, windows/ti_printer_plugin.cpp y linux/ti_printer_plugin.cc.
  • PLG-08 — Encoding respeta codeTable:

    • Agregado mapa _codePageMaps con 9 code pages (CP437, CP850, CP858, CP860, CP863, CP865, CP852, CP857, ISO_8859-15).
    • _encode() consulta _codeTable ?? _styles.codeTable para seleccionar el mapa activo.
  • PLG-17 — Linux serial retorna NotImplemented:

    • openSerialPort/closeSerialPort/sendCommandToSerial/readStatusSerial usan fl_method_not_implemented_response_new().
  • PLG-20 — Capabilities duplicado eliminado:

    • Eliminados assets/resources/capabilities.json y lib/resources/capabilities.json de la raíz del plugin.
    • Conservado example/assets/resources/capabilities.json como única copia canónica.
  • Logo printing (example):

    • Corregido error que imprimía un rectángulo negro en lugar del logo.
    • _createLogo() + imageRaster() reemplazado por _buildLogoBytes() que construye un bitmap 1-bit manualmente (pixel por pixel) y lo envía con el comando raw GS v 0.
    • Se ignoran píxeles transparentes (alpha <= 128) y se calcula luminancia correcta con pesos RGB.
    • Se corrigió el uso de getBytes() para leer datos de píxeles, evitando inconsistencias con getPixel().
  • Compatibilidad con CMake >= 4.0 (Windows):

    • Agregado set(CMAKE_POLICY_VERSION_MINIMUM 3.5) en windows/CMakeLists.txt antes de FetchContent_MakeAvailable(googletest), resolviendo el error Compatibility with CMake < 3.5 has been removed.
  • Mejoras en la app de ejemplo:

    • PrinterState y PrinterLogEntry ahora usan Equatable para comparaciones correctas.
    • Agregado PrinterStatusView con UI de monitoreo en tiempo real (online, papel, tapa, logs).
    • PrinterState.usbPrinters actualizado a List<PrinterDeviceInfo>.
    • PrinterState.selectedUsbPrinter actualizado a PrinterDeviceInfo?.
    • Logs de refreshUsbPrinters() muestran resolvedDisplayName e instanceId de cada impresora.
    • DropdownButtonFormField usa p.resolvedDisplayName como texto visible.
    • TicketBuilder ahora usa rutas relativas para importar esc_pos_utils_platform.
    • Agregados assets assets/logo.png y assets/resources/capabilities.json en el ejemplo.
    • Mejorado PrinterStatusInterpreter con interpretación robusta de flags de estado DLE EOT.
    • Actualizado image_utils.dart con corrección en el cálculo de dstW.
  • Correcciones en Linux:

    • readStatusUsb alineado con Windows: acepta Uint8List directamente.
    • Manejo robusto de errores en escritura USB (send_command_to_usb con reintento en EINTR y detección de ENODEV/EIO/EBADF).
  • Actualización de documentación:

    • README, CHANGELOG y doc/fixes_aplicados_pendientes.md actualizados con todos los cambios.
    • Renombrado docs/doc/ para cumplir convención de pub.dev.

1.0.11 #

  • Update documentación

1.0.10 #

  • Windows windows/ti_printer_plugin.cpp
    • PLG-01: hUsb_ inicializado en INVALID_HANDLE_VALUE.
    • PLG-02: ReadStatusUsb y ReadStatusSerial devuelven todos los bytes.
    • PLG-03: USB abierto con FILE_FLAG_OVERLAPPED e I/O async con timeout y CancelIoEx.
    • PLG-15: SendCommandToUsb con loop por escritura parcial.
    • PLG-19: Conversión UTF-8 -> UTF-16 con MultiByteToWideChar.
    • PLG-21: El destructor usa CloseUsbPort() de forma simétrica.
    • PLG-22: Se remueve OVERLAPPED muerto de SendCommandToSerial.
  • Linux linux/ti_printer_plugin.cc
    • PLG-02: read_status_usb devuelve todos los bytes leídos.
  • Dart lib/esc_pos_utils_platform/src/generator.dart
    • PLG-06: beep() recursivo concatena retornos.
    • PLG-07: oldRrow concatena el wrap.
    • PLG-08: Se agrega comentario detallado sobre la limitación de codeTable.
    • PLG-09: _getLexemes("") protegido.
    • PLG-10: _intLowHigh con paréntesis correctos.
    • PLG-11 / PLG-12: Limpieza de dead code en row() y eliminación del round-trip bytes -> String -> trim.
    • PLG-13: drawImage sin asignación dentro del ternario.
  • Dart lib/esc_pos_utils_platform/src/qrcode.dart
    • PLG-04: pL / pH con split de 16 bits para soportar payloads mayores a 252 bytes.
    • PLG-05: utf8.encode en lugar de latin1.encode.

1.0.9 #

  • Se corrige en Windows MissingPluginException para closeUsbPort en el canal ti_printer_plugin.

1.0.8 #

  • Se corrige MissingPluginException para closeUsbPort en el canal ti_printer_plugin.

1.0.7 #

  • Se agrega soporte para closeUsbPort.

1.0.6 #

  • Se corrigen errores para publicacion y validacion en pub.dev.

1.0.5 #

  • Se agrega soporte para Linux.

1.0.4 #

  • Se eliminan trazas de comandos ESC/POS en consola dentro de ReadStatusUsb.

1.0.3 #

  • Se corrige el manejo de error y error_code en ti_printer_plugin.cpp.

1.0.2 #

  • Se comentan salidas por consola en ti_printer_plugin.

1.0.1 #

  • Se eliminan salidas de log.

1.0.0 #

  • Versión inicial del plugin.
0
likes
0
points
820
downloads

Publisher

unverified uploader

Weekly Downloads

Plugin Flutter para imprimir y consultar estado en impresoras térmicas ESC/POS por USB, ideal para POS y self-checkout en Linux/Windows.

Repository (GitHub)
View/report issues

License

unknown (license)

Dependencies

flutter, gbk_codec, hex, image, plugin_platform_interface

More

Packages that depend on ti_printer_plugin

Packages that implement ti_printer_plugin