ti_printer_plugin 1.0.17
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 deDLE EOT 1/2/4y 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 invalidoypayload 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 hayawaiten curso.stopUsbMonitor()invalida callbacks/timers pendientes y evita que sigan consultando estado despues de cerrar el puerto._pollUsbStatusOnce()ya no consulta estado siisUsbOpen == false.closeUsbPort()deja la UI USB enisUsbOpen=falseyenLineaUsb=falseal cerrar.
-
Example - Logica de monitoreo mejorada:
- Stall detection:
_applyUsbStatusResponses()detecta endpoint stall USB cuandoDLE EOT 1tiene exito peroDLE EOT 2esta 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 1dice online y toda la secuencia responde (EOT 1-4 con datos), se ignoraDLE EOT 2para evitar falsos positivos de tapa abierta. SiDLE EOT 3o4estan vacios (stall tardio), se procesaDLE EOT 2porque fue escrito antes del stall y su dato es valido. - Error en polling reflejado en estado:
_pollUsbStatusOnce()actualizaenLineaUsb: falseen el estado cuando falla la consulta. - Logs acotados:
_addLog()limita la lista a 500 entradas maximas. - Ticket sin parametro
totalredundante: Se removiototaldebuildTicket/printUsbTicketporque se recalcula desde los items. Ahora muestraEfectivo recibidoyCambioen el ticket impreso.
- Stall detection:
-
Example - Directorio
uils/renombrado autils/:- 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íag_idle_add. Una impresora en BUSY ya no puede congelar la UI. open()conO_NONBLOCK | O_NOCTTY(antes estaba comentado): niopen()niwrite()pueden bloquear indefinidamente;O_NOCTTYevita que unttyUSB/ttyACMcapture 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.
- Todo el I/O de dispositivo (
-
Linux — Drain de input antes de comandos de estado (fix respuestas contaminadas):
readStatusUsbdescarta 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 constatus.lasty gaps de 80ms.
-
Linux — Limpieza:
- Eliminado
fsync()sobre character devices (devolvía EINVAL, ignorado).
- Eliminado
-
Dart — Parseo defensivo del listado USB:
PrinterDeviceInfo.fromMapya no crashea con claves faltantes o tipos inesperados;getUsbPrintersdescarta entradas malformadas (sininstanceId) 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 rawUSB\VID_...como el nodo lógicoUSBPRINT\....OpenUsbPort(): Cuando recibe uninstanceIdde tipoUSBPRINT\..., 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_USBPRINTpara identificación de interfaces de impresora USB.
-
Base de datos de impresoras:
database_printer.dart: Agregado PID0x0E02→EPSON TM-T88V.
-
Ejemplo — Monitoreo automático al reabrir puerto:
printer_controller.dart:openSelectedUsb()ahora llama astartUsbAutoMonitor(skipOpen: true)tras abrir exitosamente, reiniciando el monitoreo periódico aunque se haya detenido previamente.startUsbAutoMonitor(): Nuevo parámetroskipOpenpara saltar la apertura cuando el puerto ya está abierto.
1.0.15 #
-
Corrección en interpretación de estado USB:
printer_status_interpreter.dart: Cambiastatus[0]→status.lastpara 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&devInfoDatadirectamente aSetupDiGetDeviceInterfaceDetaileliminando llamada redundante aSetupDiEnumDeviceInfo.
1.0.14 #
-
Carga correcta de
CapabilityProfiledesde assets del paquete:CapabilityProfile.load()yCapabilityProfile.getAvailableProfiles()ahora resuelvencapabilities.jsonusando la clave de asset del paquetepackages/ti_printer_plugin/assets/resources/capabilities.json.- La app consumidora ya no necesita declarar ni copiar
assets/resources/capabilities.jsonen su propiopubspec.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.dartyexample/lib/logic/ticket_builder.dartahora importanpackage:ti_printer_plugin/esc_pos_utils_platform/esc_pos_utils_platform.darten lugar de rutassrc/....- 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_platformse movió deexample/lib/alib/(raíz del plugin), junto conassets/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.
- La librería
1.0.12 #
-
API breaking:
getUsbPrinters()ahora retornaList<PrinterDeviceInfo>en lugar deList<String>:- Nuevo modelo
PrinterDeviceInfoconinstanceId,displayName,vid,pid. openUsbPort()ahora requieredevice.instanceIden 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
instanceIdnativo (formatoUSB\VID_xxxx&PID_xxxx\...).
- Nuevo modelo
-
Nuevo
lib/database_printer.dart:- Clase
KnownUsbPrintery listaknownThermalUsbPrinterscon +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.
- Clase
-
Windows
ListUsbInstance()— PLG-16 (Camino A + B):- Camino A: Segunda pasada con
GUID_DEVCLASS_PRINTERpara capturar impresoras con drivers propietarios (Epson, Star, Bixolon), con dedup contra la primera pasada. - Camino B: Retorna
vector<PrinterDeviceInfo>coninstanceId,displayName,vid,pid. - Helpers estáticos reemplazados por lambdas inline para eliminar posibles bugs de linking.
OutputDebugStringAagregado para depurar fallos deSetupDiGetClassDevsyCM_Get_Device_ID.
- Camino A: Segunda pasada con
-
Linux
list_usb_printers()— PLG-18 (VID/PID desde sysfs):- Nuevas funciones helper
resolve_sysfs_path()yread_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 encontraridVendor/idProduct. displayNamese genera como"USB Printer (VID:0xPPPP, PID:0xPPPP)"si se encontraron VID/PID.- Sin dependencias externas (solo POSIX:
stat,realpath,ifstream,snprintf).
- Nuevas funciones helper
-
Reestructuración del plugin:
- La librería
esc_pos_utils_platformse 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.
- La librería
-
API simplificada (Dart + nativo) — PLG-14:
readStatusUsb(Uint8List command)yreadStatusSerial(Uint8List command)ahora aceptanUint8Listdirectamente (ya no requiereMap {"command": ...}).- Actualizados
lib/ti_printer_plugin_method_channel.dart,windows/ti_printer_plugin.cppylinux/ti_printer_plugin.cc.
-
PLG-08 — Encoding respeta codeTable:
- Agregado mapa
_codePageMapscon 9 code pages (CP437, CP850, CP858, CP860, CP863, CP865, CP852, CP857, ISO_8859-15). _encode()consulta_codeTable ?? _styles.codeTablepara seleccionar el mapa activo.
- Agregado mapa
-
PLG-17 — Linux serial retorna NotImplemented:
openSerialPort/closeSerialPort/sendCommandToSerial/readStatusSerialusanfl_method_not_implemented_response_new().
-
PLG-20 — Capabilities duplicado eliminado:
- Eliminados
assets/resources/capabilities.jsonylib/resources/capabilities.jsonde la raíz del plugin. - Conservado
example/assets/resources/capabilities.jsoncomo única copia canónica.
- Eliminados
-
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 rawGS 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 congetPixel().
-
Compatibilidad con CMake >= 4.0 (Windows):
- Agregado
set(CMAKE_POLICY_VERSION_MINIMUM 3.5)enwindows/CMakeLists.txtantes deFetchContent_MakeAvailable(googletest), resolviendo el errorCompatibility with CMake < 3.5 has been removed.
- Agregado
-
Mejoras en la app de ejemplo:
PrinterStateyPrinterLogEntryahora usanEquatablepara comparaciones correctas.- Agregado
PrinterStatusViewcon UI de monitoreo en tiempo real (online, papel, tapa, logs). PrinterState.usbPrintersactualizado aList<PrinterDeviceInfo>.PrinterState.selectedUsbPrinteractualizado aPrinterDeviceInfo?.- Logs de
refreshUsbPrinters()muestranresolvedDisplayNameeinstanceIdde cada impresora. DropdownButtonFormFieldusap.resolvedDisplayNamecomo texto visible.TicketBuilderahora usa rutas relativas para importaresc_pos_utils_platform.- Agregados assets
assets/logo.pngyassets/resources/capabilities.jsonen el ejemplo. - Mejorado
PrinterStatusInterpretercon interpretación robusta de flags de estado DLE EOT. - Actualizado
image_utils.dartcon corrección en el cálculo dedstW.
-
Correcciones en Linux:
readStatusUsbalineado con Windows: aceptaUint8Listdirectamente.- Manejo robusto de errores en escritura USB (
send_command_to_usbcon reintento enEINTRy detección deENODEV/EIO/EBADF).
-
Actualización de documentación:
- README, CHANGELOG y
doc/fixes_aplicados_pendientes.mdactualizados con todos los cambios. - Renombrado
docs/→doc/para cumplir convención de pub.dev.
- README, CHANGELOG y
1.0.11 #
- Update documentación
1.0.10 #
- Windows
windows/ti_printer_plugin.cpp- PLG-01:
hUsb_inicializado enINVALID_HANDLE_VALUE. - PLG-02:
ReadStatusUsbyReadStatusSerialdevuelven todos los bytes. - PLG-03: USB abierto con
FILE_FLAG_OVERLAPPEDe I/O async con timeout yCancelIoEx. - PLG-15:
SendCommandToUsbcon 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
OVERLAPPEDmuerto deSendCommandToSerial.
- PLG-01:
- Linux
linux/ti_printer_plugin.cc- PLG-02:
read_status_usbdevuelve todos los bytes leídos.
- PLG-02:
- Dart
lib/esc_pos_utils_platform/src/generator.dart- PLG-06:
beep()recursivo concatena retornos. - PLG-07:
oldRrowconcatena el wrap. - PLG-08: Se agrega comentario detallado sobre la limitación de
codeTable. - PLG-09:
_getLexemes("")protegido. - PLG-10:
_intLowHighcon paréntesis correctos. - PLG-11 / PLG-12: Limpieza de dead code en
row()y eliminación del round-tripbytes -> String -> trim. - PLG-13:
drawImagesin asignación dentro del ternario.
- PLG-06:
- Dart
lib/esc_pos_utils_platform/src/qrcode.dart- PLG-04:
pL/pHcon split de 16 bits para soportar payloads mayores a 252 bytes. - PLG-05:
utf8.encodeen lugar delatin1.encode.
- PLG-04:
1.0.9 #
- Se corrige en Windows
MissingPluginExceptionparacloseUsbPorten el canalti_printer_plugin.
1.0.8 #
- Se corrige
MissingPluginExceptionparacloseUsbPorten el canalti_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
erroryerror_codeenti_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.