Precisión de Tiempos
3 · Configuración inicial
¿Cómo usar Precisión de Tiempos?
El cronometraje siempre manda tiempos con 3 decimales: 1:23.299, +0.456, 23.478. En TV muchas veces no entra todo ese texto, sobre todo en columnas chicas del Totem o Crawl. La Precisión de Tiempos te deja elegir cuántos decimales mostrar al aire: 1, 2 o 3. No redondea nunca: recorta. 1:23.299 con 2 decimales se ve 1:23.29, con 1 decimal 1:23.2. Así nunca inventás una milésima que no existió.
1. Antes de empezar
El feed manda 3 decimales siempre
SpeedHive, Cronos, archivos guardados: todos mandan con 3 decimales. Race-G los guarda completos en window._lastRawData y window._cfResultRaw (copia sin truncar) y recién al mostrar los recorta según lo que elijas.
Solo recorta strings ya formateados
La función truncDecimals(str, precision) busca ^([^.]*\.)(\d+)(.*)$: toma lo que está después del punto y deja solo los primeros N dígitos. Si el valor tiene menos decimales que los pedidos, lo deja intacto, nunca completa con ceros.
Lista blanca de campos
Solo toca tiempos con milésimas: besttime, lasttime, totaltime, secondbesttime, gap, difference, sector1-5, bestlaptime, ideal_time, time (solo dentro de filas). No toca posición, número, velocidad SpeedTrap, puntos, vueltas. Así no rompe nada por accidente.
Limpieza de ceros a la izquierda
Después de recortar, pasa por rgTrimTime: quita ceros innecesarios. 00:06.256 → 6.256, 00:00.256 → 0.256, 00:01:22.783 → 1:22.783, +00:01.234 → +1.234. Lo que no parece tiempo (“1 Vuelta”, “PIT”) queda igual.
2. Dónde está
Screenshots/precision-config.pngSelect con 1 decimal ej 1:23.2, 2 decimales ej 1:23.29, 3 decimales ej 1:23.299 original.CONFIG → Display → Precisión de tiempos
Select cf-time-precision con 3 opciones: 1 decimal — ej: 1:23.2, 2 decimales — ej: 1:23.29, 3 decimales — ej: 1:23.299 (original). Guardado en config.json → display.time_precision default 3.
API y vivo
GET /api/time_precision devuelve {time_precision:3}. POST /api/time_precision {time_precision:2} guarda en config, hace clamp 1-3 (si mandás 0 o 5 vuelve a 3) y emite socket time_precision_change {time_precision}. El layout lo aplica al instante sin recargar.
Copia sin truncar guardada
Cuando cambiás precisión, el layout no pide datos nuevos al crono: reaplica recorte sobre window._lastRawData (último dato vivo sin truncar) y window._cfResultRaw (resultado guardado del Clasificador Final). Por eso podés cambiar de 3 a 1 decimal al aire sin perder milésimas: al volver a 3 siguen ahí.
3. Cómo funciona el recorte
Screenshots/precision-layout.pngComparativa de tabla con 3 decimales vs 1 decimal: 1:23.299 → 1:23.2, +0.456 → +0.4, 23.478 → 23.4.4. Dónde se ve el cambio
Tabla en vivo
Mejor T., Última V., Total, Gap, Diferencia, Sectores. Todo lo que sea tiempo con punto se recorta.
Totem y Crawl
Totem lateral y Crawl Superior/Inferior leen all_competitors, que también se trunca. Por eso el Totem respeta precisión aunque use copia distinta a la tabla. Importante porque Totem tiene columnas angostas.
Clasificador Final y Campeonato en Vivo
Clasificador Final vivo y guardado, Campeonato Completo y En Vivo, Últimas Vueltas, Mejores 5 Vueltas, referencias de líder/pole/ideal. Todos pasan por misma lista blanca.
Acortado extra de TotalTime +59 min
Además de precisión, existe shortenTotalToTenths(str): si tiempo total supera 59 minutos (carreras largas de horas), recorta TotalTime a 1 decimal aunque tengas 3 seleccionado, porque “2:23:45.123” no entra en columna. Umbral: totalSec > 59*60. Si es menor (23 min, 45 min, 58 min) deja 3 decimales completos.
5. Parámetros a tener en cuenta
| Parámetro | Default | Qué hace y validación |
|---|---|---|
| display.time_precision | 3 | 1, 2 o 3. En API y CONFIG se hace clamp: si mandás <1 o >3 vuelve a 3. En layout si isNaN vuelve a 3. |
| _TIME_PRECISION_KEYS | besttime, lasttime, totaltime, secondbesttime, gap, difference, sector1-5, bestlaptime, ideal_time, time | Solo esos campos se tocan. time solo dentro de filas (competitors), no a nivel superior donde puede ser hora del día. |
| truncDecimals | recorte | Regex ^([^.]*\.)(\d+)(.*)$ . Si decPart.length <= precision no toca. Ej: 1:23.2 con precisión 2 queda 1:23.2 (no agrega cero). |
| rgTrimTime | limpieza | Quita 00: iniciales pero deja al menos un dígito. Conserva + / - si es gap. |
| shortenTotalToTenths | solo TotalTime >59 min | Regex \.(\d)\d+$ → .$1. Solo si total supera 59 minutos. |
6. Cómo se usa en transmisión — flujo recomendado
7. Precauciones
Nunca redondea, siempre recorta. 1:23.299 con 2 decimales es 1:23.29, no 1:23.30. Si tu reglamento exige redondeo, no uses esta opción: mostrá 3 decimales y recortá en post-producción. Esta opción está pensada para no inventar tiempo.
No completa ceros. Si el feed manda 1:23.2 y pedís 3 decimales, queda 1:23.2, no 1:23.200. Nunca inventa dígitos.
No toca velocidades ni puntos. SpeedTrap (km/h), puntos de campeonato, número de auto, posición, vueltas no se recortan porque no están en la lista blanca. Si ves 120.456 km/h es velocidad, no tiempo, y se deja con decimales originales.
time a nivel superior puede ser hora del día. Por eso _truncTimeFieldsOf con isTop true no toca time si está en data raíz (puede ser “14:23:10” hora). Solo recorta time dentro de competitors donde sí es tiempo de vuelta.
all_competitors es copia aparte. El bug histórico era que solo se truncaba competitors y Totem/Crawl seguían con 3 decimales porque leen all_competitors. Ahora se trunca también all_competitors en applyTimePrecision.
TotalTime >59 min se acorta solo a décimas. Aunque tengas 3 decimales seleccionado, si total supera 59 minutos, shortenTotalToTenths lo deja en 1 decimal para que entre en columna. Es intencional para endurance. Si no querés eso, no uses TotalTime en Totem o agrandá columna.
Cambio al aire guarda global. window._cfgTimePrecision se guarda para que vistas que no pasan por applyTimePrecision (Clasificador Final guardado) sepan qué precisión usar cuando se cargan sin dato vivo previo.
Guardado sin truncar para poder volver. window._lastRawData y _cfResultRaw siempre guardan copia sin truncar. Si cambiás de 1 a 3 decimales al aire, vuelve a mostrar 1:23.299 completo sin pedir datos nuevos al crono.
8. Problemas frecuentes
| Lo que ves | Qué hacer |
|---|---|
| Puse 1 decimal pero Totem sigue con 3 | Era bug viejo: all_competitors no se truncaba. Ahora sí. Si te pasa, recargá layout y verificá que applyTimePrecision toque all_competitors. Si es Clasificador Final guardado, es _cfApplyPrecisionToRows que se dispara en time_precision_change. |
| 1:23.299 con 2 decimales muestra 1:23.29 no 1:23.30 | Correcto: recorta, no redondea. Es por diseño. |
| Gap +00:01.234 queda +1.234 | Correcto: rgTrimTime quita ceros a la izquierda innecesarios, deja +1.234. Si es “1 Vuelta” no lo toca. |
| TotalTime de 2 horas sigue con 3 decimales y no entra | shortenTotalToTenths solo actúa si >59 min y solo deja 1 decimal. Si tu columna sigue chica, achicá precisión a 1 decimal en CONFIG o agrandá columna en Editor Visual. |
| Cambié precisión y Clasificador Final guardado no cambia | Verificá que socket time_precision_change llegue: debe reaplicar _cfApplyPrecisionToRows sobre _cfResultRaw. Si layout está en CasparCG sin socket, la precisión viaja también en _cfg_time_precision dentro de /api/layout_data en cada poll. |
| Velocidad SpeedTrap se recortó | No debería: no está en _TIME_PRECISION_KEYS. Si la ves recortada, es porque tu campo se llama “time” o “gap” por error en el feed. |
| Puse 0 o 5 decimales y volvió a 3 | Clamp 1-3 en server y en setTimePrecision. Solo permite 1,2,3. Default 3. |
9. Lista de control rápida
Al preparar el evento
Definí qué precisión vas a usar por tipo de sesión: quali 3 decimales, carrera corta 2, endurance 1. Dejá default 3 en CONFIG.
Antes de salir al aire
Probar en Totem y Crawl con tiempos reales: ¿entra +0.456 o necesitás +0.45? Cambiá en CONFIG y verificá que todos los overlays cambien (tabla, totem, crawl, clasificador, campeonato, últimas vueltas).
Durante la transmisión
Podés cambiar al aire sin recargar: CONFIG → Display → Precisión → 1/2/3 → se emite en vivo y reaplica sobre copia sin truncar. No perdés milésimas al volver a 3.
Al terminar
Backup de config.json (contiene display.time_precision). La próxima fecha arranca con misma precisión.