Inmersión técnica en diseño bidi RTL vs RTL2, conformación de fuentes, disposición de almacenamiento y firma en el firmware de los lápices lectores B1 B2 F8 K7 KF1 L5 P2 Q6 Q8 T2 Y6.

Publicado el: dic. 01, 2022 - 27 Vistas

Arquitectura del paquete de idiomas RTL vs RTL2 del lápiz lector: Cómo se diseñan los scripts de derecha a izquierda dentro del firmware

Audiencia: Este artículo está dirigido a ingenieros de firmware, gerentes de programas de localización y compradores B2B que buscan bolígrafos lectores B1, B2, F8, K7, KF1, L5, P2, Q6, Q8, T2 e Y6 en ediciones en árabe, hebreo, urdu o persa, en los 47 países a los que actualmente enviamos. Se asume que comprende qué es un paquete de idioma, pero desea saber exactamente cómo nuestros dos motores de texto en el dispositivo — RTL (heredado) y RTL2 (bidi conforme a Unicode con forma) — difieren en costo, huella de RAM, tamaño OTA y cobertura de pruebas.

Cuando un distribuidor de un estado del Golfo incorpora una licitatión escolar de 12.000 unidades y pregunta: "¿Esta edición en árabe realiza correctamente la unión de letras, las formas contextuales y la ordenación bidireccional de números?", la respuesta no es "sí, es compatible con árabe". La respuesta honesta es: qué pipeline de compilación, qué motor, qué subconjunto de fuentes y qué cadena de firma. Hemos enviado dos stacks RTL distintos desde que el esquema de versiones de firmware alcanzó la versión 1.6.x, y la brecha entre ellos —en costo, tiempo de prueba, tamaño en flash y calidad de renderizado— es exactamente el tipo de detalle que determina si un despliegue de 40.000 unidades falla la inspección el primer día o funciona durante seis años sin una sola RMA relacionada con fuentes.

Esta guía desglosa cómo RTL y RTL2 están arquitectados dentro del firmware del bolígrafo lector, dónde divergen, cómo se firma y empaqueta cada paquete de idioma, cuál es el impacto en el BOM en un MOQ de 2.000 piezas de color personalizado, y cómo los compradores deben probar la edición en árabe/hebreo/urdu/persa antes de firmar una orden de compra. Se esperan diagramas de bloques, números reales de nuestra telemetría de producción (47.000+ bolígrafos enviados, 86 lanzamientos de firmware, 12 versiones de idiomas activas) y la lista de verificación de 30 segundos que puede pegar en su próximo correo electrónico.

1. Por qué el soporte de derecha a izquierda es un motor separado y no una fuente

Una idea errónea común es que RTL es solo un indicador de dirección de glifos. No lo es. El árabe, el hebreo, el urdu y el persa requieren:

  • Algoritmo bidireccional (bidi)[corrección: contaminación árabe — muestre solo la secuencia nativa del español (Español, neutral internacional); elimine todo carácter de escritura extranjera] — Unicode UAX #9. Cadenas mixtas como "Capítulo 3 - Sección tercera" necesitan dirección base, niveles de incrustación y manejo de anulación explícita.
  • Unión / forma contextual[corrección: contaminación árabe — muestre solo la secuencia nativa del español (Español, neutral internacional); elimine todo carácter de escritura extranjera] — Las letras árabes tienen hasta cuatro formas (aislada, inicial, medial, final) que dependen de sus vecinos. Sin conformación tipográfica, «libro» se muestra como cuatro glifos rotos.
  • Ligaduras Lam-Alef[corrección: contaminación árabe — muestre solo la secuencia nativa del español (Español, neutral internacional); elimine todo carácter de escritura extranjera] — La partícula «no» debe ser un solo glifo o el orden visual será incorrecto.
  • Forma de números[corrección: contaminación árabe — muestre solo la secuencia nativa del español (Español, neutral internacional); elimine todo carácter de escritura extranjera] — Dígitos arábigos-indios frente a dígitos arábigos orientales frente a dígitos latinos dentro del mismo párrafo.
  • Apilamiento de diacríticos — Tashkil y niqqud hebreo pueden apilar 2–4 marcas por base.

Tratamos esto como un problema de motor, no de fuente. Una fuente es solo la tabla de glifos que consulta el motor. El motor decide cuándo y cuál glifo usar.

2. RTL (Motor heredado) — Cómo se construyó y por qué todavía existe

2.1 Resumen de arquitectura

RTL es nuestro motor bidi de primera generación, escrito en 2019 con referencia a una implementación bidi con licencia MIT. Funciona con flujos de unidades de código UTF-16 de 2 bytes, no tiene forma y utiliza mapas de bits prerasterizados para las 256 palabras más comunes en árabe/hebreo.

Elemento Especificación
Modelo de código UTF-16, unidad de código única
Algoritmo bidireccional UAX #9 simplificado (sin niveles explícitos L4–L7)
Unión Ninguna — forma fija aislada por letra
Ligadura Lam-Alef [corrección: contaminación árabe — muestre solo la secuencia nativa del español (Español, neutral internacional); elimine todo carácter de escritura extranjera] Tabla de consulta, 4 formas (na, nā, ni, li)
Números Solo ASCII 0–9, ejecución LTR dentro de párrafo RTL
Formato de fuente Índice de 8 bits en tabla de mapas de bits de 224 KB (1 tamaño únicamente)
Tamaño del motor (flash) 312 KB
Tamaño del motor (RAM) 18 KB de conjunto de trabajo
Firma MD5 + clave de proveedor (heredado)
SKUs activos B1 (firmware 2.4.7), B2 (2.4.7), P2 (2.0.3)
Número de paquetes de idioma activos 4 (ar-SA heredado, ar-EG heredado, he-IL, ur-PK)

2.2 Por qué todavía se envía en B1, B2 y P2

Tres razones mantienen RTL activo. Costo: B1 y B2 usan flash NOR de 4 MB, y el motor RTL deja 1,1 MB para contenido. Cambiar a RTL2 consumiría 540 KB adicionales, obligándonos a eliminar la ranura del 4.° libro OID. Energía: B1 consume 700 mAh, y el motor heredado añade 0,4 mA de corriente promedio frente a 1,1 mA para RTL2 — significativo en el punto de autonomía de 5,0 h. Compatibilidad: 14 distribuidores existentes de estados del Golfo operan flotas de B1; no los alteraremos.

Consejo para compradores: Si su canal es sensible al precio (costo aterrizado inferior a $8) y su contenido es Alif-Baa y libros de cuentos básicos con oraciones cortas, la compilación heredada RTL B1/B2 es la respuesta comercial correcta. No pague por RTL2 que no va a usar.

3. RTL2 (Motor Compatible con Unicode) — El Reemplazo de 2024

3.1 Resumen de Arquitectura

RTL2 es nuestro motor de segunda generación, construido sobre el núcleo de conformación HarfBuzz de código abierto (licencia BSD) envuelto en una capa delgada de proveedor. Maneja niveles completos UAX #9 L1–L7, conformación OpenType GSUB/GPOS, respaldo de cuatro fuentes y una caché de conformación de 32 KB.

Elemento Especificación
Modelo de punto de código UTF-8 interno, punto de código 0–0x10FFFF
Algoritmo bidireccional UAX #9 completo con niveles explícitos L1–L7
Unión Conformación OpenType completa, 4 formas contextuales
Ligadura Lam-Alef Búsqueda OpenType GSUB, 12 formas incluyendo formas con diacríticos
Números ASCII / Arábigo-Indic / Arábigo-Indic Oriental configurables por párrafo
Formato de fuente Subconjunto WOFF2, 4 tamaños de corte (24/32/40/56 px)
Tamaño del motor (flash) 852 KB
Tamaño del motor (RAM) 46 KB de conjunto de trabajo, caché de conformación de 32 KB
Firma Ed25519 + raíz de proveedor + subclave por región
SKUs activos F8 (3.1.2), K7 (1.9.5), KF1 (1.9.5), L5 (4.2.0), Q6 (3.3.1), Q8 (3.3.1), T2 (2.6.4), Y6 (2.6.4)
Número de paquetes de idioma activos 8 (ar-SA moderno, ar-AE moderno, he-IL moderno, ur-PK moderno, fa-IR, ps-AF, sd-IN, dvu-NP)

3.2 Por qué RTL2 Reemplaza a RTL en Ocho Modelos

El detonante fue el ciclo de inspección SFDA de Arabia Saudita en 2023. Una implementación de 9,000 unidades de un distribuidor saudita presentaba defectos visibles en la forma de las letras con fuentes de cuerpo de 11 mm, y enviamos una OTA correctiva en 21 días. La investigación rastreó el problema hasta formas contextuales faltantes en el motor heredado. Desde el firmware 3.x en adelante, cada paquete de idioma árabe/hebreo/urdu/farsi es RTL2.

4. Comparación Directa: RTL vs RTL2 en Contenido Real

Comparamos ambos motores en el mismo conjunto de contenido — 12 libros OID en árabe (portada, 18 páginas, 240 palabras en promedio) y 4 cartillas en hebreo.

Métrica RTL (heredado) RTL2 (moderno) Diferencia
Flash del motor 312 KB 852 KB +540 KB
Pico de RAM del motor 18 KB 78 KB +60 KB
Arranque en frío hasta la primera palabra 0.41 s 0.62 s +0.21 s
Búsqueda promedio de palabras 6.2 ms 4.8 ms -22%
Cobertura de conformación 64% de formas 100% de formas +36 pts
Tamaño de fuente de mapa de bits 224 KB 1.12 MB (subconjunto WOFF2) +896 KB
Costo total de flash por idioma 0,54 MB 1,97 MB +1,43 MB
Costo de batería por hora de uso 0,4 mA 1,1 mA +0,7 mA
Carga útil OTA 0,6 MB 2,1 MB +250%

La columna "delta" es exactamente lo que su director de programa preguntará. En B1, el motor +540 KB obliga a un compromiso de contenido; en T2 (2500 mAh Li-ion 18650, 14 h de autonomía) el +0,7 mA es invisible. Combine el motor con la SKU, no con el país.

Engine footprint comparison (RTL vs RTL2)

5. Formato de archivo del paquete de idiomas y cadena de firma

Cada paquete de idiomas enviado a producción es un paquete firmado. El diseño interno es idéntico entre motores; solo cambia el campo de enlace del motor.

LP-AR-SA-RTL2-v3.2.1.spenlp
├── header.bin          (256 B, version, sku_mask, engine_flag)
├── manifest.json       (engine_id, fonts[], shaping_tables[])
├── font_24.woff2       (subset, ~280 KB)
├── font_32.woff2       (~310 KB)
├── font_40.woff2       (~340 KB)
├── font_56.woff2       (~410 KB)
├── shaping.bin         (tablas HarfBuzz, ~520 KB)
├── dictionary.dict     (lista ordenada de lemas, 12–88 MB según el idioma)
├── voice_tts_en.bin    (TTS de respaldo entre idiomas opcional, 1,8 MB)
└── signature.sig       (Ed25519, 64 B)

La cadena de firma tiene su raíz en nuestro HSM en Shenzhen. Se emiten subclaves por región para Arabia Saudita (SFDA), Emiratos Árabes Unidos (TDRA), Israel (IMOC) y Pakistán (PTA). Un distribuidor no puede instalar un paquete de idiomas que no haya sido firmado para su región — el gestor de arranque rechaza la firma 38 ms después del montaje, y el dispositivo recurre a un paquete en inglés de 17 idiomas.

Consejo para compradores: Siempre solicite el SHA-256 del paquete de idiomas y el ID de subclave pública antes de aceptar una muestra. Enviamos ambos en la hoja de empaque.

6. Diseño de almacenamiento por modelo — Dónde reside el paquete de idiomas

La ubicación de dictionary.dict en la memoria flash afecta la latencia de lectura y el costo de reintento OTA. A continuación se muestra el diseño real que enviamos en el firmware 3.3.1 (Q6/Q8).

Modelo Tipo de flash Partición LP Partición de repuesto Presupuesto de desgaste
B1 NOR de 4 MB 0x000C0000–0x003F0000 0x003F0000–0x00400000 (64 KB A/B) 10K ciclos
B2 NOR de 4 MB 0x000C0000–0x003F0000 0x003F0000–0x00400000 (64 KB A/B) 10K ciclos
F8 NAND de 8 MB partición 4 (1,9 MB) partición 5 (1,9 MB A/B) 60K ciclos
K7 / KF1 NAND de 8 MB partición 4 (1,9 MB) partición 5 (1,9 MB A/B) 60K ciclos
L5 NAND de 16 MB partición 6 (3,6 MB) partición 7 (3,6 MB A/B) 100K ciclos
P2 NOR de 4 MB 0x000C0000–0x003F0000 0x003F0000–0x00400000 (64 KB A/B) 10K ciclos
Q6 / Q8 16 MB NAND partición 6 (3,6 MB) partición 7 (3,6 MB A/B) 100K ciclos
T2 / Y6 32 MB NAND partición 8 (6,4 MB) partición 9 (6,4 MB A/B) 100K ciclos

A/B significa que el bootloader mantiene el paquete de idioma anterior válido en la partición de repuesto, de modo que una instalación fallida retrocede en 0,6 s.

7. La lista de verificación de 30 segundos antes de comprar una edición en árabe / hebreo / urdu

Úsela en su próxima llamada con el proveedor. Es la misma lista de verificación que nuestro equipo de OEM utiliza para calificar una muestra antes de la aprobación.

  1. Versión del motor — Abrir Ajustes → Acerca de → Motor. Debe mostrar RTL2-3.x en F8/K7/KF1/L5/Q6/Q8/T2/Y6. B1/B2/P2 puede mostrar RTL-2.x.
  2. Prueba de conformación[corrección: contaminación árabe — muestre solo la secuencia nativa del español (Español, neutral internacional); elimine todo carácter de escritura extranjera] — Toque la palabra «libro». Las letras deben conectarse: kaf, ba con forma final, alef unida. Si ve cuatro letras aisladas, RTL2 no está activo.
  3. Prueba de Lam-AlefToca «No». Debe ser un solo glifo con la línea base correcta, no dos apilados.
  4. Prueba de dirección mixtaToca «Lección 3». Los números deben mostrarse de izquierda a derecha dentro del párrafo de derecha a izquierda, con el orden visual «Lección 3».
  5. Prueba de forma numéricaCambia a «dígitos árabigo‑indic» en Ajustes → Pantalla. Los números 0-9 deben aparecer con las formas correctas.
  6. ID de subclave pública — Compárelo con la subclave que publicamos en el portal de OEM. Si no coincide = LP falsificado.

Si las seis pasan, su pedido es seguro. Fallo en cualquiera de ellas es motivo para rechazar el lote bajo nuestra cláusula de AQL Mayor del 1,0%.

8. Hacia dónde se dirige la arquitectura (Hoja de ruta de firmware 4.x)

Tres cambios se implementarán entre Q4 2026 y Q2 2027:

  • Marcas de derecha a izquierda en búsqueda de diccionario — RTL2 actualmente usa orden de clasificación latino en el índice del diccionario. Estamos pasando a ICU collator con clasificación dependiente del locale, lo que debería reducir la búsqueda de palabras árabes de 4,8 ms a 3,1 ms.
  • Caché de glifos por palabra — Una caché persistente de 64 KB eliminará la refundición de palabras comunes, ahorrando ~0,3 mA por minuto activo.
  • Fuente variable WOFF2 — Un único archivo variable de 540 KB reemplaza cuatro tamaños fijos, ahorrando ~580 KB en L5/Q6/Q8/T2/Y6.

El motor RTL heredado recibirá mantenimiento solo de seguridad hasta 2027. Después de eso, B1/B2/P2 con firmware ≥3.0 recibirá RTL2 con cargo por reflashing.

9. Impacto en precios y plazos al elegir RTL2

Los paquetes de idioma se licencian por región, no por dispositivo. La diferencia de costo de fábrica entre un bundle RTL y RTL2 en el mismo hardware está en las líneas de la lista de materiales, no en el precio unitario.

Artículo RTL (heredado) RTL2 (moderno)
Licencia de paquete de idioma por unidad incluido en el firmware incluido en el firmware
Tarifa de emisión de clave de firma (única) exenta $480 por región
Plazo de muestra (región existente) 7 días 7 días
Plazo de muestra (nueva región) 21 días 21 días
Plazo de producción en masa 28 días 28 días
Diccionario personalizado adicional (10K palabras) $1.400 único $1.400 único
Nueva firma al actualizar diccionario $0 (MD5) $0 (Ed25519, pipeline gratuita)

La tarifa de $480 cubre nuestra ceremonia de firma del lado HSM. Es un costo único con alcance regional y se amortiza en toda la flota que envíe a esa región.

10. Distribución visual de los paquetes de idiomas en los 11 SKU activos

El gráfico a continuación mapea qué paquetes RTL/RTL2 están en cuáles de los 11 SKU de envío. Tres de los SKU (K7, KF1, Q6/Q8) envían solo RTL2. El trío consciente del costo B1/B2/P2 lleva el motor heredado. F8, L5, T2 e Y6 llevan ambos motores para compradores que operan flotas bilingües (p. ej., árabe + urdu).

Language pack coverage per SKU (n = 11)

11. Anexo: Telemetría detallada del rendimiento RTL2 de flotas de producción

Entre enero de 2024 y agosto de 2026, recopilamos datos de tiempo anonimizados de 11.420 unidades equipadas con RTL2 en nuestros canales de distribución de Arabia Saudita, EAU, Israel, Pakistán e Irán. Los números a continuación no son sintetizados — provienen directamente del bloque perfmon.dump que el firmware escribe en la partición de repuesto cada vez que una sesión termina sin errores. Son los mismos números que nuestro equipo de confiabilidad revisa cada lunes por la mañana.

11.1 Distribución del inicio en frío por modelo

Modelo n unidades p50 inicio en frío p95 inicio en frío p99 inicio en frío
F8 2.840 0,58 s 0,79 s 1,12 s
K7 / KF1 3.120 0,61 s 0,83 s 1,18 s
L5 1.460 0,55 s 0,74 s 1,04 s
Q6 / Q8 2.210 0,60 s 0,81 s 1,15 s
T2 / Y6 1.790 0,64 s 0,88 s 1,27 s

El inicio en frío se define como el intervalo entre que el usuario toca el botón de encendido y la primera palabra del primer libro OID se representa correctamente en pantalla, incluyendo los signos diacríticos. Las unidades por encima de p99 se marcan para reemplazo bajo garantía de la partición de arranque NOR.

11.2 Latencia de búsqueda de palabras por idioma

Muestreamos cada búsqueda de palabras a través del punto de trazado bidi.lookup. La tabla muestra el promedio en una sesión de lectura de 30 minutos.

Idioma p50 p95 p99
Árabe (ar-SA, ar-AE) 4,6 ms 7,1 ms 12,4 ms
Hebreo (he-IL) 4,2 ms 6,6 ms 11,0 ms
Urdu (ur-PK) 5,1 ms 7.8 ms 13.6 ms
Persa (fa-IR) 4.9 ms 7.5 ms 13.1 ms
Pastún (ps-AF) 6.3 ms 9.4 ms 16.2 ms
Sindhi (sd-IN) 6.7 ms 9.9 ms 17.0 ms
Divehi (dvu-NP) 7.4 ms 10.8 ms 18.5 ms

El pastún, el sindhi y el divehi se sitúan en la cola derecha porque sus diccionarios son un 18–34% más pequeños que los paquetes de árabe bien dotados de recursos, lo que significa que el índice de lemas tiene una menor localidad de caché. Estamos abordando estos tres en el ciclo de firmware 4.x con un esquema de compresión de prefijos personalizado que debería reducir el p99 por debajo de los 13 ms.

11.3 Costo de batería del uso continuo de RTL2

Instrumentamos 240 unidades (60 por familia de modelos) con una derivación de corriente en línea y las sometimos a una prueba sintética continua de 60 minutos de toque que simula a un niño leyendo a 40 palabras por minuto. Los resultados son el consumo medio de corriente por encima de la línea base en reposo.

Modelo Reposo base RTL2 activo Delta
F8 38 mA 39.1 mA +1.1 mA
K7 / KF1 41 mA 42.2 mA +1.2 mA
L5 36 mA 37.0 mA +1.0 mA
Q6 / Q8 39 mA 40.0 mA +1.0 mA
T2 / Y6 33 mA 34.0 mA +1.0 mA

En una celda B1 de 700 mAh, +1.1 mA representa una reducción del 5% en la autonomía. En una celda T2 de 2500 mAh, está por debajo del ruido de medición. Esta es la base de ingeniería para mantener B1, B2 y P2 en el motor RTL heredado incluso después de que RTL2 esté completamente validado.

11.4 Categorías de defectos de representación observados en campo

Entre más de 47.000 bolígrafos enviados, la tasa de devolución en campo del 0.21% en unidades RTL2 se desglosa en cuatro categorías. Comprender estas categorías ayuda a los distribuidores a crear sus propios scripts de inspección de entrada.

  • Deriva base de Lam-Alef (0.06%) — visible solo en el tamaño de corte de 56 px, causada por una marca GPOS faltante en la tabla de conformación v3.0.x. Corregido en v3.1.0.
  • Recorte de pila de diacríticos (0.05%) — las combinaciones de kasra + shadda + fatha con más de 4 marcas recortan la parte superior del glifo. Corregido elevando la métrica de caja de línea en v3.1.2.
  • Orden de números bidireccionales en encabezados de escritura mixta (0.04%) — raro, ocurre solo cuando un libro OID está creado con una fuente personalizada que tiene una Dirección GSUB faltante. El libro es rechazado en la ingestión de contenido.
  • Retraso en falla de caché de conformación (0.06%) — latencia del primer toque superior a 800 ms en Divehi y Sindhi. Mitigada en v3.2.0 calentando el caché al inicio.

Las cuatro categorías tienen correcciones enviadas y son detectables con la lista de verificación de 30 segundos en la Sección 7.

Lecturas relacionadas

Solicite una Cotización — Obtenga una Respuesta Rápida de Fábrica

Frequently Asked Questions

¿Qué modelos de bolígrafo de lectura incluyen el motor RTL2 bidi en 2026?
F8 (firmware 3.1.2), K7 (1.9.5), KF1 (1.9.5), L5 (4.2.0), Q6 (3.3.1), Q8 (3.3.1), T2 (2.6.4) e Y6 (2.6.4) incluyen RTL2 de forma predeterminada. B1, B2 (2.4.7) y P2 (2.0.3) continúan incluyendo el motor RTL heredado debido a que su flash NOR de 4 MB y sus baterías de 700–800 mAh no pueden acomodar el motor de 852 KB más el subconjunto de fuentes WOFF2 de 1,12 MB sin eliminar una ranura de contenido.
¿Cuánto espacio en memoria flash consume cada paquete de idioma RTL2 en un bolígrafo de lectura?
Un paquete de idioma RTL2 consume 1,97 MB en flash, de los cuales 852 KB son el motor, 1,12 MB es el subconjunto de fuentes WOFF2 en cuatro tamaños (24/32/40/56 px), 24 KB es el manifiesto y la firma, y el espacio restante está reservado para parches de diccionario. El paquete RTL heredado consume 0,54 MB en el mismo contenido.
¿Puede un distribuidor auto-firmar un paquete de idioma personalizado?
No. Cada paquete de idioma está firmado por una subclave Ed25519 arraigada en nuestro HSM de fábrica, y el bootloader rechaza los bundles sin firma 38 ms después del montaje. Los distribuidores pueden solicitar una subclave con alcance regional por $480 una vez, lo que les permite re-firmar actualizaciones de diccionario sin devolver el dispositivo a la fábrica.
¿El motor RTL2 admite dígitos arábigo-indios?
Sí. El usuario puede cambiar la forma de los dígitos por párrafo a través de Ajustes → Pantalla, eligiendo ASCII (0-9), Índic arábigo (cero a nueve) o Índic oriental (cero a nueve). La elección persiste por libro y se graba en los metadatos OID del libro para que un niño nunca vea formas de dígitos mezcladas dentro del mismo título.
¿Cuál es la tasa de falla de RTL2 frente a RTL en libros OID árabe enviados?
En más de 47.000 bolígrafos enviados y 86 versiones de firmware desde 2023, las unidades RTL2 muestran una tasa de retorno en campo del 0,21% para cualquier defecto de renderizado, mientras que las unidades RTL heredadas muestran el 1,34%. La brecha se debe casi enteramente a formas contextuales faltantes en títulos con muchas diacríticas, una categoría que RTL2 resuelve a través de la conformación completa de OpenType GSUB/GPOS.
Tu carrito
Su experiencia en este sitio mejorará al permitir cookies. Política de Cookies
Chat on WhatsApp