Capítulo 1 EMBEDDED VISUAL C++ (EVC) 0 Introducción En la presente práctica se pretender ofrecer la primera toma de contacto con el entorno de desarrollo que se usa para programar PDAs en el lenguaje de programación C/C++. Este entorno de desarrollo permite crear aplicaciones muy complicadas con ventanas Windows PPC 2003. Pero en esta asignatura no se pretende que el alumno aprenda a programar aplicaciones con ventanas, ni siquiera que aprenda a programar en C o C++. Pero por otro lado, para poder controlar los robots es necesario saber programar en C. Aunque la programación en C se da por supuesta, el alumno no tiene por qué conocer el entorno de desarrollo necesario para programar PDAs. Por ello los objetivos de esta practica son: Saber realizar y depurar proyectos sencillos en el Embedded Visual C++. Estos proyectos están orientados a controlar robots. Estas aplicaciones constan de un interfaz gráfico, donde al menos se indica al robot que arranque y pare, y de un algoritmo de control, que funciona a ritmo de reloj, donde se programa la inteligencia del robot. Por ello, los proyectos se basarán en una aplicación con una ventana (llamada también Dialogo) que servirá de interfaz con el usuario y de un timer que se usará para ejecutar un algoritmo de forma periódica. Entender como se hacen interfaces gráficos sencillos, de forma que la práctica sea una guía de referencia para futuras prácticas. En esta primera toma de contacto el procedimiento a seguir es el siguiente: En primer lugar se aprenderá a crear un proyecto basado en una ventana de Dialogo. Es importantísimo realizar todos los pasos exactamente tal y como se indica en la práctica, sino es muy fácil perderse en la misma. Este
procedimiento debe seguirse siempre que se quiera crear un nuevo proyecto en sucesivas prácticas. Posteriormente se irán adquiriendo conocimientos para poder personalizar el interfaz de la aplicación, hasta hacerlo interactivo con el usuario. Un aspecto importante es cómo se usan los timers, para poder programar los robots. Se irán introduciendo conceptos para poder depurar un programa que funcionando no lo hace de forma satisfactoria. Finalmente se aprenderá cómo cargar y ejecutar un programa desde una PDA real. 1 Creación de un nuevo proyecto El objetivo es crear un proyecto basado en una ventana de Dialogo. Es importantísimo realizar todos los pasos exactamente tal y como se indica en la práctica, sino es muy fácil perderse en la misma. Este procedimiento debe seguirse siempre que se quiera crear un nuevo proyecto en sucesivas prácticas. 1. Ir al menú File->New. 2. Seleccionar en el cuadro de dialogo New las siguientes opciones: Asegurarse de elegir WCE Pocket PC 2003 MFC AppWizard (exe)!!! Project name: Dlg Location: c:\temp\ grupo de laboratorio \p1. Este directorio tiene que existir; por ello, es necesario crearlo con el Explorador de Windows. Resto de opciones por defecto como en figura
3. Pulsar OK. 4. En el nuevo cuadro de dialogo seleccionar Dialog Based y pulsar el botón "Finish" 5. Pulsar OK.
2 Descripción de la ventana de proyecto En la siguiente figura se muestran los nombre de las diferentes ventanas que hay en el proyecto. Barra de selección Ventana workspace de Ventana de código Ventana de mensajes En la ventana de workspace hay tres pestañas: 1. Classes: no la vamos a usar. 2. Resources: es donde vamos a tocar para poder cambiar el interfaz gráfico de nuestra aplicación. 3. FileView: es el lugar donde se encuentran nuestros ficheros de código C/C++. Una vez creado el proyecto EVC crea 4 ficheros, ver Ventana workspace- >FileView->Source Files:
Dlg.cpp/.h: fichero donde se encuentra el código de la aplicación principal; es decir, el equivalente a main. Este fichero no es necesario tocarlo en ninguna aplicación que hagamos en el laboratorio. Dlg.rc: En este fichero se encuentran almacenados los recursos que usa la aplicación. Estos recursos son las ventanas, botones, etc. Este fichero no se puede tocar directamente. De hecho si se hace doble clic sobre él se muestra un entorno gráfico donde se puede modificar el aspecto de la ventana de Dialogo del proyecto. Dlgdlg.cpp/.h: Es el código de la ventana de Dialogo creada. Este fichero es el punto de partida que se tiene que tocar para poder desarrollar el programa que va a ir en el robot. Stdafx.cpp/.h: Es un fichero que siempre existe en todos los proyectos, y que no hace falta entender pero que es necesario para que todo funcione. 3 Ejecutar el programa En esta sección se va a aprender cómo se ejecuta un programa desde el emulador de la PDA, bien lanzado desde el propio emulador (usando el explorador de archivos) o desde el EVC (con la instrucción Go). 1) En la barra de selección. Elegir en las tres listas desplegables: Pocket PC 2003, Win32 (WinCE Emulator) debug, Pocket PC 2003 Emulation. Esto selecciona el tipo de archivo ejecutable que se necesita. Según el tipo de PDA y de sistema operativo el archivo ejecutable tiene diferente formato. Como ejemplo: en un ordenador convencional no se puede ejecutar un programa de UNIX en Windows. 2) Escribir en Project->Project settings->debug->download directory \Windows\Programs. De esta manera se define el lugar de la PDA (o emulador) en donde se quiere descargar el ejecutable generado por EVC. Por lo tanto, si queremos ejecutar este programa desde el emulador es necesario ir con el explorador al directorio correspondiente. OJO!!! Este
directorio varía si se cambia de tipo de archivo ejecutable (ver punto anterior). Si no sale la pestaña Debug significa que en el árbol de proyecto de la izda de la ventana Project settings no se ha seleccionado, el nodo raíz (seleccionado por defecto), que es el proyecto Dlg. 3) Ejecutar Build->Start Debug->Go. Decir que sí a lo que se pregunte. Tiene que arrancar el Emulador de PPC 2003 y ejecutarse el programa en el mismo. El emulador es como la PDA que hay en el laboratorio. 4) Parar el programa Build->Stop Debugging. 5) Estudiar un poco el emulador. Utilizar el explorador de archivos, etc. Ejecutar desde la PDA el programa que se acaba de hacer. Pararlo. Si no se para cuando se intente volver a cargar el programa desde EVC el sistema no podrá hacerlo porque el archivo ejecutable está en uso. 4 Cambiar el aspecto del Dialogo 1) Seleccionar el fichero de recursos donde se muestra la ventana de Dialogo. 2) Hacer doble clic sobre Ventana Workspace->Resources->Dialog- >IDD_DLG_DIALOG 3) Borramos la etiqueta que hay por defecto en el Dialogo. Se selecciona y se pulsa el botón suprimir. 4) Añadimos una etiqueta al Dialogo. Elegir Static Text de la ventana de controles que aparece en el punto 2 y arrastrar hasta el lugar que queramos de la ventana de Dialogo. Si no se puede ver la ventana de controles, activar Controls en Tools->Customize->Toolbars, o bien pulsar botón derecho en la barra de herramientas y activar Controls. 5) Escribir hola mundo. Hacer clic con el botón derecho del ratón y seleccionar propiedades. En la pestaña General escribir hola mundo en Caption.
6) Ejecutar el programa de nuevo. 5 Dialogo interactivo En esta sección es necesario seguir los pasos tal y como se explica. No se pueden añadir más componentes de los indicados, ni borrarlos. En tal caso, en posteriores apartados se pueden tener problemas (ver último párrafo de esta sección en caso de que surjan problemas). 1) Seleccionar el fichero de recursos donde se muestra la ventana de Dialogo. 2) Hacer doble clic sobre Ventana Workspace->Resources->Dialog- >IDD_DLG_DIALOG 3) Añadimos un cuadro de texto. Elegir Edit Box de la ventana de controles que aparece en el punto 2 y arrastrar hasta el lugar que queramos de la ventana. 4) Añadimos otro cuadro de texto. Elegir Edit Box de la ventana de controles que aparece en el punto 2 y arrastrar hasta el lugar que queramos de la ventana. 5) Añadimos un botón. Elegir Button de la ventana de controles que aparece en el punto 2 y arrastrar hasta el lugar que queramos de la ventana. 6) Escribir Run en el botón. Hacer clic con el botón derecho del ratón y seleccionar propiedades. En la pestaña General escribir Run en Caption. 7) Hacer doble click sobre el botón. Aceptar el nombre que sugiere en la pantalla. 8) Escribir el siguiente código en la función que se acaba de crear. Pulsar F1 sobre la función que queráis ayuda. Este código copia el texto del cuadro de texto primero sobre el segundo.
unsigned short utext[10]; // variable donde se almacena el texto unsigned int nelem; // número de caracteres del texto nelem = GetDlgItemText(IDC_EDIT1,uText,10); // coge el texto SetDlgItemText(IDC_EDIT2, utext); // lo copia al otro cuadro de texto SetDlgItemInt(IDC_EDIT1, 12,false); // ejemplo de como se escribe un número UpdateData(false); // actualiza los datos en pantalla 9) Ejecutar el programa Es necesario hacer notar que el cuadro de texto que se añadió primero se llama por defecto IDC_EDIT1 y que el segundo cuadro de texto se llama IDC_EDIT2. Si se quieren modificar esos nombres hacer clic con el botón derecho del ratón sobre el cuadro de texto y seleccionar Propiedades->General. Evidentemente si los nombres cambian, entonces el código que hace referencia a ellos es necesario también cambiarlos. 6 A golpe de reloj El objetivo es crear un contador que se incremente cada 10 segundos. De esta manera se aprende a manejar un timer, esencial para programar un robot. 1) Ir a la ventana de recursos 2) Hacer clic en botón derecho del ratón (sobre la ventana de dialogo "Ventana Workspace->Resources->Dialog->IDD_DLG_DIALOG") y ejecutar Events. Seleccionar WM_TIMER y pulsar el botón Add Handler. Luego pulsad OK. 3) En dlgdlg.cpp se ha añadido una nueva función, que hay que completar como sigue ( Ojo la función ya existe, no hay que copiarla, sólo rellenarla!) void CdlgDlg::OnTimer(UINT nidevent) { // La funcion se ejecuta cada vez que el timer termina la cuenta, esto después de que pasan los 10 segundos
KillTimer(1); // borrado de la cuenta del timer, se pone a 0 SetDlgItemInt(IDC_EDIT1, i++,false); // aumenta en 1 el contador, el numero del Edit Box UpdateData(false); // actualiza los datos en pantalla SetTimer(1,10000, NULL); // inicializa el timer; cada 10 segundos aumenta la cuenta CDialog::OnTimer(nIDEvent); } 4) Añadir la siguiente variable global en dlgdlg.cpp int i = 0; 5) En la función BOOL CDlgDlg::OnInitDialog() añadir justo antes del return : SetTimer(1, 10000,NULL); // inicializa el timer para que cuente 10 segundos 6) Ejecutar el programa. qué hace? 7 Debug de programas En esta sección se va a tratar de cómo depurar programas. Un Breakpoint es un lugar del código donde se le dice a VCE que pause la ejecución del programa cuando llegue al mismo. Sirve para ver el estado de las variables en ese momento o para seguir ejecutando el programa de una línea en una línea. 1) Añadir un Breakpoint en la siguiente línea de la función OnTimer. Encima de la línea clic botón derecho del ratón y ejecutar Inserta Breakpoint SetDlgItemInt(IDC_EDIT1, i++,false); //aumenta en 1 el contador
2) Ejecutar el programa 3) Cuando el programa se para en el Breakpoint, ver el valor de la variable i en la ventana de watch. View->Debug Windows->Watch 4) A partir de ese punto ejecutar línea a línea el código bien pulsando la tecla F10, o bien Debug->Step Over. Observar como cambia el valor de la variable i en la ventana de watch. El comando Debug->Step Into sirve para que si la ejecución de la línea contiene una función, poder introducirse en la misma. 5) Investigar el comando Debug->Run to cursor. 8 Ejecución en la PDA Se puede hacer todo lo dicho hasta ahora en la PDA seleccionando en la barra de selección: Pocket PC 2003, Win32 (WinCE ARM) debug, Pocket PC 2003 Device. Para que todo funcione es necesario tener arrancado el ActiveSync con la PDA conectada. Ojo! en Project->Settings->Debug con el directorio de descarga del programa. 1. Investigar todas las secciones anteriores pero con la PDA conectada. 9 Ejercicio Hacer un programa que muestre un círculo en pantalla que en función de un número introducido por un cuadro de texto se coloree de color rojo si el número es mayor que 0 y de color verde si el número es menor o igual que 0. 1) Hacerlo con un botón 2) Hacerlo muestreando cada 5 segundos
Pistas: CDC *pdc=getdc( ); // coge la zona de la pantalla donde se pinta CBrush verde(rgb(255,0,0)); // Define una brocha de pintura verde CBrush rojo(rgb(0,255,0)); if(rojo) pdc->selectobject(rojo); // indica que pinte de rojo else pdc->selectobject(verde); pdc->ellipse(50,70,70,90); // pinta una elipse Para coger un número de un cuadro de texto (Edit Box): int num; // número donde se va a guardar el resultado num = GetDlgItemInt(IDC_EDIT1, NULL, true); // Coge un número con signo de IDC_EDIT1