sábado, 12 de mayo de 2012

Sistema de menús

Nuestra práctica en si consistía en el reconocimiento de gestos estáticos con PIC32, pero como hemos mencionado en la anterior entrada, hemos dedicado este tercer hito a desarrollar una aplicación demostrativa de su funcionamiento, orientada a control domótico.

Hemos implantado para ello un sistema de menús: un menú principal desde el que, con diferentes gestos listados en el manual de usuario, puedes acceder a diversos submenús con las funcionalidades del sistema.

Idle: menú principal, en el que se ve el reloj del sistema y desde el que se puede acceder mediante gestos específicos a cualquiera de los submenús.

Luces: submenú para control de luces. Indicando un número del 1 al 5 se accede al control de una de cinco luces posibles; con otro gesto pueden encenderse y apagarse (toggle) y moviendo el dedo de arriba abajo se calibra la intensidad lumínica de la luz seleccionada.

Clima: control de climatización. Deslizando el dedo de arriba abajo por la pantalla se selecciona la temperatura deseada, la cual se valida mediante otro gesto.

Reloj: cambia la hora del sistema. Permite, de nuevo mediante gestos, cada uno asociado a un dígito del 0 al 9, ir cambiando cada dígito de la hora. 

Música: función no implantada por el momento, y que posiblemente sea retirada o sustituida.

Juego: accede al minijuego de prueba, un juego de piedra-papel-tijera contra el PIC. Al iniciar debe seleccionarse el número de partidas a desarrollar, y hace uso de varios timers para la cuenta atrás antes de cada partida, espera entre dos juegos, etc. Al final de cada juego muestra por pantalla el ganador (PIC o humano).

Hemos seleccionado los gestos asociados al acceso a cada submenú y control del mismo con cuidado para que resulten todo lo intuitivos que sea posible.


Para el desarrollo software del sistema de menús nos basamos en un funcionamiento por punteros a funciones. En el main del sistema siempre se ejecuta la función a la que apunta el puntero func_menu; de esta forma para pasar del menú a un submenú simplemente editamos la función a la que apunta el puntero. Esto se hace en idle para acceder a cualquier otro de los submenús, o a la salida del submenú para volver a idle.

func_menu define los parámetros de entrada que tendrán las funciones a las que apunta. Por tanto todas las funciones de menú tienen como argumentos el gesto reconocido en el fotograma y la información proporcionada por el tracking de dedos, dada la necesidad de homogeneizar. Esto es así a pesar de que algunas funciones como reloj o juego no hacen uso del tracking de dedos y sólo utilizan el número de gesto reconocido.

 A continuación se incluye una porción de código de idle, la función que hace de menú principal y desde el que puede accederse a todos los demás, a fin de ilustrar el uso de punteros.


  1. void idle(uint8_t gesto, struct dedos *dedos_t) {
  2.     if (!timeout[2]) {
  3.         switch (gesto) { //pasamos a una u otra función según el gesto que elija el usuario
  4.             case GESTO_LUCES: //el usuario quiere acceder al menú de luces
  5.                 func_menu = &luz_control; // pasamos a control de luces
  6.                 break;
  7.             case GESTO_CLIMA:
  8.                 func_menu = &clima_control; //pasamos a control de climatizador
  9.                 break;
  10.             case GESTO_RELOJ:
  11.                 func_menu = &hora_control;
  12.                 break;
  13.             case GESTO_JUEGO:
  14.                 func_menu = &juegoPPT; //pasamos a juego
  15.                 break;
  16.             case GESTO_MUSICA:
  17.                 //printf("paso a musica \n");
  18.                 break;
  19.         }
  20.     }

No hay comentarios:

Publicar un comentario