Programando en USER RPL
Menús de usuario, GROB, WAIT y KEY

Mario de Lama   malar@arrakis.es
http://www.arrakis.es/~malar

Regresar


En el capítulo 30 de la Guía de usuario de la hp48 vienen un par de páginas dedicadas a los menús de usuario. Seguramente esto valga para la mayoría de la gente pero para otros es una información escasa, sobre todo si lo que deseas es programar. La mayor omisión de dicho capítulo es la referente a los menús gráficos. Si, has oido bien, en la hp puedes introducir un gráfico como etiqueta de menú de forma que al presionar sobre la tecla correspondiente se ejecute un programa. No estás obligado a poner una cadena de caracteres.

Ya sabes que al comando MENU puedes darle dos usos según los argumentos que le presentes

Donde "etiqueta_i" es la cadena de caracteres que aparece en el menú de pantalla y las distintas acciones son las que se ejecutan al presionar esa tecla con los modos de desplazamiento posibles. La etiqueta no tiene por que ser un string, puedes sustituirla con un GROB (gráfico) de 21 columnas por 7 filas ya que este es el tamaņo de las etiquetas (la primera fila se suele usar para poner la barra que distingue a los directorios de las variables). En realidad la calculadora lo que hace es transformar la cadena que le suministras en un grob y luego ponerlo en la pantalla, si colocas un grob en vez de un string le facilitas la tarea.


Hago un inciso para recordar los fundamentos de las bases numéricas. Si nos dan un número de 4 dígitos MLKJ en alguna de las siguientes bases, este nos expresa:

BASEGUARISMOS USADOSMLKJ
binaria0 12^3 x M +2^2 x L +2^1 x K +2^0 x J
octal0 1 2 3 4 5 6 78^3 x M +8^2 x L +8^1 x K +8^0 x J
decimal0 1 2 3 4 5 6 7 8 910^3 x M +10^2 x L +10^1 x K +10^0 x J
hexadecimal0 1 2 3 4 5 6 7 8
9 A B C D E F
16^3 x M +16^2 x L +16^1 x K +16^0 x J


Si alguna vez has transformado un grob en cadena de caracteres, o si lo has puesto en la pila y le has dado al cursor que indica hacia abajo entrando en el modo edicción, puedes ver su estructura que es:

"GROB "NēColumnas" "NēFilas" Gráfico"

En "NēColumnas" y "NēFilas" se expresa el ancho y alto del gráfico en pixeles (puntos de pantalla). En "Gráfico" se da la información acerca del gráfico en una secuencia de hexadecimales. ŋCómo se codifica esa secuencia? Cada número hexadecimal se corresponde con cuatro números binarios que son los que indican si el pixel que representan, con su valor 1 ó 0, está encendido o apagado. Por tanto, cada hexadecimal representa a cuatro pixeles, pero hay una salvedad, el hexadecimal #Eh (en binario #1110d) representa al grob 0111 (simétrico al 1110), quiere esto decir que los cuatro pixeles han de leerse de derecha a izquierda por lo que los bites más significativos se corresponden con los pixeles de más a la derecha. El orden que se sigue para representar el gráfico es de izquierda a derecha y de arriba a abajo, el primer hexadecimal representará entonces a los cuatro pixeles de la esquina superior izquierda.
Como las filas de los gráficos no tienen porque tener un número de pixeles divisibles por 4, al final de cada línea nos quedarán 1, 2, 3 ó 4 pixeles. En el último caso no habrá ningún problema, ponemos el hexadecimal correspondiente y vale. Pero si nos quedan, por ejemplo, 3 pixeles estos se representarán por los 3 bits menos significativos, los de la izquierda y el restante lo ignorará el sistema operativo de la calculadora cuando vaya a representar el gráfico, por ejemplo el grob 110 queda representado por el #3h (que en binario sería #0011d).

Como vale más una imagen que mil palabras vamos a obtener la codificación del siguiente grob:

chaplin

Si lo separamos en filas y aplicamos la regla anterior tendremos:

chaplin2

Si ponemos todos los hexadecimales seguidos obtendremos el grob:

 GROB 21 8 0C78100FF5200284200BA110010900029400044200083100
Un poco de historia: La revista Forum HP nació en Barcelona en Diciembre de 1992 y murió en Diciembre de 1993. La dirigió Carles Crespo y entre sus colaboradores se encontraban Enrique de la Torre, Julián Garrido, Daniel C. Bachero, Marcos Ortega y también colaboré algo yo. Se distribuía por correo (entonces sólo usaban Internet los pocos que podían pagar una conexión y la factura del teléfono). Tiempos gloriosos :)
Esto viene a cuento de que en uno de los números, Daniel C. Bachero puso en esta revista un artículo en el que daba el código de un programa para hacer estos iconos para los menús sin necesidad de hacer la bestialidad que he puesto antes ni tener que dibujarlos en pequeñito en la pantalla. El archivo MENUS tiene el código fuente de ese programa junto a unos cuantos ejemplos que hice en su día y que puse en el archivo ETIQUETAS. si los quieres ver, pasa ETIQUETAS a la hp y con sólo presionar sobre ella verás como aparecen los menús gráficos (entre ellos está el Chaplin del ejemplo). Puedes hacer cuantos desees con el programa ICONO.

ETIQUETAS no es más que:

\< {
GROB 21 8 00E0000051000842000444000EFF10004000EFFFF0CFFF30
GROB 21 8 0EFF00054410800020EFFFF04111508FFF3001401083E830
GROB 21 8 0208008F0E3040114020A08020A080104001000000000000
GROB 21 8 00FF10080130049970CFFFF1CFB7F1EFFFF1EFFFF10E0C10
GROB 21 8 0C1800031C008C1A00831A00803800815810822820010010
GROB 21 8 0C78100FF5200284200BA110010900029400044200083100
GROB 21 8 02590084F5200DE61042D94081F13042E8400D061084F520
GROB 21 8 C10081E300E1FF08F1FFFFF1FFFFF1DD08F12200E1C10081
GROB 21 8 000000CFFF7000462000462000231000990000990000EF10
GROB 21 8 0000008008F0A20CF1E30C81FFFF81FFFF81000CF10008F0
GROB 21 8 0CC7000EDF000FBF300FBF100FBF000FB7008F7B00080100
GROB 21 8 0C300042400021B000294100CFFF300144400228300C1000
GROB 21 8 CC18302E7C701FFD709FFF70EFFF3087FF608FEFF00FDFF1
GROB 21 8 006C10007220F333604C8C90819C90836360030220000C10
} TMENU
\>
Vereis que al final no hago presentar el menú con MENU si no con TMENU. Este comando lo usamos cuando no queremos que el menú se guarde en la variable de sistema CST. Si hubiese usado MENU, se me crea esa variable y cada vez que presione la tecla dura CST me aparecerá ese menú. Sin embargo, al usar TMENU no se crea esa variable y tendríamos que poner de nuevo la lista en la pila y presionar TMENU cada vez.
Esto, que en principio parece un engorro, es bueno para que nuestros programas no dejen llenos los menús de variables con CST.

Si deseas mostrar un menú durante la ejecución de un programa has de parar su ejecución con PROMPT o HALT. Es lo normal ya que desearás que el programa se detenga para que el usuario pueda darte los datos. Si deseas que se detenga con WAIT tienes dos posibilidades, ejecutar 0 WAIT ó -1 WAIT. Con la primera logras que el programa se detenga y WAIT te devuelve el código de la tecla pulsada (mira en el capítulo 30 estos códigos) y continúa el programa. -1 WAIT hace lo mismo pero ademas fuerza al sistema a que muestre el menú especificado con anterioridad. Hacer la prueba es muy fácil, sólo debes poner la línea -1 WAIT y 0 WAIT al final del programa etiqueta, verás como sólo se muestra el menú en el primer caso.

Hay otra forma de 'detener' el proceso del programa. Es mediante el uso de KEY. Este comando nos devuelve constantemente un 0 (falso) a la pila hasta que presionamos una tecla, en ese momento devuelve un 1 (verdadero) y el código de la tecla presionada. Por ello KEY debe ser usado en un bucle indefinido y en realidad no detiene al programa:

\< 
  1 DO
       1 +
    UNTIL
       KEY
    END
    IF DUP 51 \=/
    THEN DROP2
    ELSE DROP
    END
\>
Este programilla va sumando 1 al primer 1 que ponemos hasta que presionamos una tecla, si es ENTER (código 51) el programa deja el total en la pila, en caso contrario lo borra. Si el programa es el siguiente vereis que no se muestra el menú hasta finalizar el programa, estamos en el mismo caso que con 0 WAIT.

\< {
GROB 21 8 00E0000051000842000444000EFF10004000EFFFF0CFFF30
GROB 21 8 0EFF00054410800020EFFFF04111508FFF3001401083E830
GROB 21 8 0208008F0E3040114020A08020A080104001000000000000
GROB 21 8 00FF10080130049970CFFFF1CFB7F1EFFFF1EFFFF10E0C10
GROB 21 8 0C1800031C008C1A00831A00803800815810822820010010
GROB 21 8 0C78100FF5200284200BA110010900029400044200083100
GROB 21 8 02590084F5200DE61042D94081F13042E8400D061084F520
GROB 21 8 C10081E300E1FF08F1FFFFF1FFFFF1DD08F12200E1C10081
GROB 21 8 000000CFFF7000462000462000231000990000990000EF10
GROB 21 8 0000008008F0A20CF1E30C81FFFF81FFFF81000CF10008F0
GROB 21 8 0CC7000EDF000FBF300FBF100FBF000FB7008F7B00080100
GROB 21 8 0C300042400021B000294100CFFF300144400228300C1000
GROB 21 8 CC18302E7C701FFD709FFF70EFFF3087FF608FEFF00FDFF1
GROB 21 8 006C10007220F333604C8C90819C90836360030220000C10
} TMENU
  1 DO
       1 +
    UNTIL
       KEY
    END
    IF DUP 51 \=/
    THEN DROP2
    ELSE DROP
    END
\>


Regresar