Flujo de generación de capturas de pantalla¶
Todas las capturas de pantalla de este manual (actualmente ~590, en
docs/en/assets/) se obtuvieron mediante scripts que controlan el simulador real
de Ethos, no de forma manual. El sistema reside en el antiguo repositorio
ethos-manual, en
english/manual/, y todavía no se ha trasladado a este repositorio — esta
página documenta su funcionamiento para que pueda trasladarse, y para que
mientras tanto las capturas puedan regenerarse o ampliarse sin empezar de cero.
Cómo está estructurado¶
Para cada menú/sección del manual existe un par de archivos:
manual/macros/<name>.lua— un script escrito contra la API Lua del simulador (más abajo) que navega hasta una pantalla concreta y llama asimulator.screenshot(path)en cada punto que merece capturarse.manual/<name>.sh— un envoltorio de una sola línea que lanza el binario del simulador para una emisora concreta, apuntando a esa macro, por ejemplo:
ETHOS='/mnt/c/Program Files (x86)/FrSky/Ethos'
"${ETHOS}/X20S/simulator.exe" --read-only --no-gui --no-audio \
--radio-settings ./x20s-en.bin --sd-directory ./sd --flash-directory ./flash \
--exec ./macros/model-mixes.lua
manual/screenshots.sh ejecuta todas las macros en secuencia para regenerar el
conjunto completo. Existen archivos .sh individuales por sección, de modo que
las capturas de una sola página puedan regenerarse sin volver a ejecutarlo todo
(cada macro tarda desde unos pocos segundos hasta más de un minuto).
Opciones CLI principales:
--read-only— no conservar ningún cambio realizado durante la ejecución.--no-gui/--no-audio— modo casi sin interfaz; algunas macros aún necesitan la GUI porque, sin ella, el simulador «se salta» pasos (véase el comentario enscreenshots.sh).--radio-settings <file>.bin— con qué ajustes guardados de emisora arrancar (esto es lo que hace que las capturas sean específicas de un idioma y una emisora — una ejecución en alemán usa un.binen alemán).--sd-directory,--flash-directory,--documents-directory,--audio-directory— indican al simulador qué modelos/firmware/documentos/audio debe ver, de forma que las capturas reflejen contenido preparado deliberadamente y no lo que haya en una SD card real.--exec <script>.lua— la macro que se ejecutará tras el arranque.
Cada familia de emisoras (X20S, X20 Pro, X20 Pro AW, X18S) tiene su propio
binario de simulador y necesita su propio archivo --radio-settings por idioma
(por ejemplo, x20s-en.bin, x20pro-en.bin), ya que la interfaz difiere
ligeramente entre emisoras y el archivo de ajustes también determina el idioma.
La API de macros¶
Las macros son Lua puro y controlan una variable global simulator:
| Llamada | Finalidad |
|---|---|
simulator.loadModel("name.bin") |
Cargar un archivo de modelo concreto antes de navegar — cada sección del manual usa un modelo preparado para demostrar esa sección (véase la lista de modelos más abajo). |
simulator.pressKey(KEY_X, [holdSeconds]) |
Pulsar una tecla física — KEY_ENTER, KEY_RTN, KEY_MDL, KEY_SYS, KEY_DISP, KEY_PAGE, etc. Una duración de mantenimiento provoca una pulsación larga (abre menús contextuales). |
simulator.turnRotaryEncoder(n) |
Mover el encoder n clics (negativo = sentido inverso) — la forma principal de desplazar el cursor entre campos. |
simulator.touch(x, y) |
Tocar una coordenada concreta de la pantalla — se usa donde el táctil es la única forma de llegar a algo (por ejemplo, cambiar la distribución del teclado). |
simulator.setAnalog(channel, value) |
Fijar directamente la posición de un stick/potenciómetro/deslizador (0-3 son los cuatro sticks principales, ANALOG_LAST_SLIDER el último deslizador), de modo que las capturas muestren un valor deliberado y reproducible en lugar del valor por defecto del simulador. |
simulator.setSwitch(n, position) |
Fijar la posición de un interruptor físico. |
simulator.setDateTime({...}) |
Fijar el reloj del simulador, de modo que las marcas de tiempo de las capturas (y cualquier elemento dependiente del tiempo) sean reproducibles entre ejecuciones. |
simulator.screenshot(path) |
Capturar la pantalla actual en un PNG, con ruta relativa al directorio de trabajo de la macro (de ahí las rutas ../assets/... dentro de cada macro). |
simulator.connectUsb() |
Simular la conexión por USB, para capturar el menú USB. |
simulator.sleep(seconds) |
Esperar a que una animación o un valor de telemetría se estabilice antes de capturar. |
manual/macros/common.lua se carga con dofile desde la mayoría de las macros y
simplemente fija la fecha y la hora, de modo que todas las macros parten del
mismo instante simulado.
Modelos usados por sección¶
manual/notes.txt (heredado de manera informal, aún no copiado a este
repositorio) relaciona cada macro con el archivo de modelo .bin del que
depende y por qué — por ejemplo, model-mixes.lua usa rarebear.bin,
model-fm.lua usa zblank.bin (un modelo con una configuración de fases de
vuelo deliberadamente vacía), model-trims.lua usa blaster.bin (configurado
con trims desplazados para demostrar el rango de trim). Trasladar las notas de
este archivo a documentación propia aquí forma parte del trabajo de la fase 2
descrito más abajo.
Qué implica trasladar esto al nuevo repositorio (aún sin hacer)¶
- Decidir si las macros se ejecutan directamente desde este repositorio (lo que requiere una instalación local del simulador de Ethos, como hacía el repositorio antiguo) o mediante CI con el simulador incluido o descargado en el flujo de trabajo.
- Reestructurar las rutas de salida planas
../assets/...para que coincidan con la organización de recursos por página y por idioma de este repositorio (docs/<locale>/assets/). - Un archivo
--radio-settings ... .biny una ejecución de capturas por idioma, en cuanto exista un idioma distinto deen— las capturas son específicas del idioma de la interfaz y no pueden compartirse entre idiomas. - Decidir qué parte de las ~40 macros existentes se traslada tal cual y qué parte se reescribe conforme a la estructura de navegación actual de este repositorio (algunas macros producen capturas para secciones que ya no se corresponden 1:1 con la organización de páginas de este manual).