ti_printer_plugin 1.0.17 copy "ti_printer_plugin: ^1.0.17" to clipboard
ti_printer_plugin: ^1.0.17 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.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
160
points
664
downloads

Documentation

API reference

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

MIT (license)

Dependencies

flutter, gbk_codec, hex, image, plugin_platform_interface

More

Packages that depend on ti_printer_plugin

Packages that implement ti_printer_plugin