Este documento pretende ser una referencia de mejores prácticas para el desarrollo de pantallas de uso general.
Aunque es posible programar cualquier cosa que tan solo trabaje con LinuxCNC, utilizar marco de trabajo, lenguaje y requisitos de configuración en común facilita la transición entre pantallas y más desarrolladores para mantenerlas.
Dicho lo anterior, nada en este documento está escrito en piedra.

1. Lenguaje

Python es actualmente el lenguaje preferido para el código de pantallas de LinuxCNC.
Python tiene una barrera de entrada baja para que usuarios nuevos modifiquen las pantallas a sus necesidades.
Python tiene conjunto enriquecido de documentación, tutoriales y librerías al alcance.
Ya se usa y esta integrado en los requisitos de sistema de LinuxCNC.
Aunque se puede usar C o C+, limita severamente quien pueda mantener y desarrollarlo.
Sería mejor extender Python con módulos C/C
+ para cualquier función que lo requiera.

2. Localización de números de punto flotante en GUIs

Diferentes locales usan distintos separadores de decimales y de miles. Se deben evitar funciones de conversión cadena a número de punto flotante a una locale específica, ya que pueden dar resultados inesperados. (Por ejemplo la cadena de texto "1.58" en de_DE será convertida a 158 por atof()). Se sugieren las siguientes pautas (basadas en evitar la ambigüedad mas que en la "exactitud" en una locale específica) si se analiza sintácticamente un número de punto flotante para una cadena y viceversa:

  • En el caso de que la entrada permita coma (,) o punto (.) como separador de decimales, pero rechace cualquier entrada que tenga más de uno de cualquiera. Se debería aceptar espacio mas no requerirlo como separador de miles.

  • En el caso de despliegue usar punto (.) consistentemente o usar el formato de localización actual consistentemente. El énfasis aquí es en "consistentemente".

3. Configuración básica

Actualmente, la mayoría de las pantallas usan una combinación de archivo INI y entradas de archivo de preferencias para configurar sus funciones.
Se usan normalmente archivos de texto INI para las configuraciones de controlador de máquina comunes, mientras que los archivos de preferencias basados en texto se usan para propiedades más relacionadas con la GUI (como sonidos, tamaño, colores).
Pueden haber otros archivos usados para traducciones, estilizando y personalización de funciones. Estos son altamente dependientes del kit de herramientas de widgets subyacente.

3.1. INI [DISPLAY]

La sección [DISPLAY] del INI es para especificar configuraciones relacionadas con la pantalla.

3.1.1. Display

Lo más importante es especificar el nombre de la pantalla que el script LinuxCNC usará para cargar.
El programa de pantalla normalmente reconoce cambios como el de establecer pantalla completa.
El título es para la ventana y el ícono se usa en la iconización de la ventana.

[DISPLAY]
DISPLAY = axis
TITLE = XYZA Rotational Axis
ICON = silver_dragon.png

3.1.2. Tiempo de ciclo

Si es configurable, así es como se establece el tiempo de ciclo de la visualización de GUI.
Es a menudo la tasa de actualización en vez del tiempo de espera entre actualizaciones.
Un valor común es 100 ms (0.1 s), aunque no es raro un rango entre 50 - 200 ms.

[DISPLAY]
CYCLE_TIME = 100

3.1.3. Rutas de archivo

Si estas funciones están disponibles en la pantalla, así deben especificarse las rutas a usar.
Estas deben referenciar desde el archivo INI actual, o permitir ~ para el directorio de inicio, o permitir el uso de rutas absolutas.

MDI_HISTORY_FILE = mdi_history.txt
PREFERENCE_FILE_PATH = gui.pref
LOG_FILE = gui-log.txt

3.1.4. Incrementos de trote

Generalmente, se usan radio botones o cajas de selección para la selección de incrementos.
Los incrementos lineales pueden ser una mezcla de pulgadas y milímetros.
Los incrementos angulares se especifican en grados.
La palabra continuo se usa para especificar trote continuo y probablemente debería agregarse incluso si no se incluye en la línea INI.

INCREMENTS = continuous, 10 mm, 1.0 mm, 0.10 mm, 0.01 mm, 1.0 inch, 0.1 inch, 0.01 inch
ANGULAR_INCREMENTS = continuous, .5, 1, 45, 90, 360

3.1.5. Indicio de tipo de máquina

A menudo la pantalla necesita ajustarse con base en el tipo de máquina. Los tornos tienen controles diferentes y muestran los DROs de manera distinta. Las máquinas de espuma muestran el trazo de forma diferente.
La vieja forma de hacer esto era agregar interruptores LATHE = 1, FOAM = 1 etc

MACHINE_TYPE_HINT = LATHE

3.1.6. Ajuste manual

El ajuste manual permite al usuario ajustar la velocidad de alimentación o la velocidad del husillo al vuelo. Se acostumbra usar un control deslizante o una perilla.
Estas configuraciones son en porcentaje.

MAX_FEED_OVERRIDE       = 120
MIN_SPINDLE_0_OVERRIDE    = 50
MAX_SPINDLE_0_OVERRIDE    = 120

3.1.7. Velocidad de trote

La mayoría de las pantallas tiene controles deslizantes para ajustar el porcentaje de velocidad lineal y angular de trote.
Estas configuraciones deberían estar especificadas en unidades de máquina por minuto para lineal y grados por minuto para angular.
Default se refiere al porcentaje inicial cuando se carga por primera vez la pantalla.

DEFAULT_LINEAR_VELOCITY =
MIN_LINEAR_VELOCITY =
MAX_LINEAR_VELOCITY =

DEFAULT_ANGULAR_VELOCITY =
MIN_ANGULAR_VELOCITY =
MAX_ANGULAR_VELOCITY =

3.1.8. Control manual de husillo

Los controles manuales del husillo pueden ser botones, deslizantes, perillas o una combinación de ellos.
Se pueden establecer límites menores a lo que el controlador de la máquina puede utilizar configurando estas entradas.
Si la pantalla es capaz de manejar múltiples husillos, entonces debería aceptar entradas mayores a el 0 mostrado.

SPINDLE_INCREMENT = 100
DEFAULT_SPINDLE_0_SPEED = 500
MIN_SPINDLE_0_SPEED = 50
MAX_SPINDLE_0_SPEED = 1000

3.2. INI [MDI_COMMAND]

Algunas pantallas usan botones para ejecutar comandos NGC Macro.
Pueden especificarse como estos ejemplos compactos.
Comandos NGC separados por dos puntos se ejecutan hasta su término antes que el siguiente.
La coma opcional separa texto para el botón del código NGC.

[MDI_COMMAND_LIST]
MDI_COMMAND_MACRO0 = G0 Z25;X0 Y0;Z0, Goto\nUser\nZero
MDI_COMMAND_MACRO1 = G53 G0 Z0;G53 G0 X0 Y0,Goto\nMachn\nZero

3.3. INI [FILTER]

Esta sección permite configurar qué archivos se muestran en el selector de archivo y qué programas filtro preprocesarán su salida antes de enviarla a LinuxCNC.
Las extensiones siguen este patrón:
PROGRAM_EXTENSION = .extension,.extensión2[espacio]Descripción de las extensiones
Las definiciones de los programas filtro son como:
extensión_de_filtro = programa_a_ejecutar

[FILTER]
# Controla que programas se muestran en el administrador de archivos:
PROGRAM_EXTENSION = .ngc,.nc,.tap G-Code File (*.ngc,*.nc,*.tap)
PROGRAM_EXTENSION = .png,.gif,.jpg Greyscale Depth Image
PROGRAM_EXTENSION = .py Python Script

# Mapea datos/extensiones de archivo de código fuente a un programa 'filtro' especial para la visualización/ejecución:
png = image-to-gcode
gif = image-to-gcode
jpg = image-to-gcode
py = python3

3.4. INI [HAL]

La mayoría de las pantallas necesitarán algunos pines HAL. Es necesario conectarlos después que la pantallas los crea.

3.4.1. Archivo Hal postgui

Estos archivos se deben ejecutar uno tras de otro en orden, después de que se hayan creado todos los pines HAL de la GUI.

[HAL]
POSTGUI_HALFILE = keypad_postgui.hal
POSTGUI_HALFILE = vfd_postgui.hal

3.4.2. Archivos de comandos Hal postgui

Estos archivos deben ejecutarse uno tras de otro en orden, después de que se hayan ejecutado todos los archivos POSTGUI.

[HAL]
POSTGUI_HALCMD = show pin qt
POSTGUI_HALCMD = loadusr halmeter

4. Configuración extendida

4.1. Incrustar elementos GUI

Una personalización común y muy útil es permitir a los usuarios construir paneles pequeños independientes que puedan incrustarse en la pantalla principal. Algunas pantallas permiten incrustar programas externos de terceros, otras solo paneles basados en los widgets nativos del kit de herramientas.
Normalmente son incrustados en pestañas o widgets de panel lateral.
Así es como se describe el título opcional, el comando de carga y el nombre del widget de ubicación:

EMBED_TAB_NAME=Vismach demo
EMBED_TAB_COMMAND=qtvcp vismach_mill_xyz
EMBED_TAB_LOCATION=tabWidget_utilities

4.2. Mensajes de diálogo del usuario

Las ventanas de diálogo con el usuario se usan para mostrar emergentemente información (normalmente errores) que el usuario puede considerar importante.
Algunas permanecen a la vista hasta que se haya arreglado el problema, algunas requieren aceptación y otras una elección si/no.
Un pin HAL de E/S botaría el diálogo, el diálogo restablecería el pin E/S y establecería cualquier pin de salida de respuesta.

[DISPLAY]
MESSAGE_BOLDTEXT = Este es un mensaje informativo
MESSAGE_TEXT = Esto es baja prioridad
MESSAGE_DETAILS = pulse OK para limpiar
MESSAGE_TYPE = okdialog status
MESSAGE_PINNAME = bothtest
MESSAGE_ICON = INFO

Este estilo proporciona mensajes múltiples definidos por un número.
Este ejemplo muestra 3 mensajes posibles con base en un número de error de VFD.

[DISPLAY]
MULTIMESSAGE_ID = VFD

MULTIMESSAGE_VFD_NUMBER = 1
MULTIMESSAGE_VFD_TYPE = okdialog status
MULTIMESSAGE_VFD_TITLE = Error VFD: 1
MULTIMESSAGE_VFD_TEXT = Este es el texto más largo PARA EL MENSAJE NUMERO 1
MULTIMESSAGE_VFD_DETAILS = DETALLES para error VFD 1
MULTIMESSAGE_VFD_ICON = WARNING

MULTIMESSAGE_VFD_NUMBER = 2
MULTIMESSAGE_VFD_TYPE = nonedialog status
MULTIMESSAGE_VFD_TITLE = Error VFD: 2
MULTIMESSAGE_VFD_TEXT = Este es el texto más largo PARA EL MENSAJE NUMERO 2
MULTIMESSAGE_VFD_DETAILS = DETALLES para error VFD 2
MULTIMESSAGE_VFD_ICON = INFO

MULTIMESSAGE_VFD_NUMBER = 3
MULTIMESSAGE_VFD_TYPE = status
MULTIMESSAGE_VFD_TITLE = Error VFD: 3
MULTIMESSAGE_VFD_TEXT = Este es el texto más largo PARA EL MENSAJE NUMERO 2.
MULTIMESSAGE_VFD_DETAILS = Deberíamos hacer algo de este mensaje.
MULTIMESSAGE_VFD_ICON = WARNING