Buenas practicas

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include <iostream>
00003 
00004 #define MAX_CLIENTES 10
00005 
00006 /*-------------------------------------
00007     VARIABLES
00008   -------------------------------------*/
00009   
00010 InterruptIn botton_entrada(PTD4);
00011 DigitalIn botton_salida();
00012 DigitalOut doPuerta(LED_BLUE);
00013 DigitalOut interrupcionLED(LED_RED);
00014 char Nombre_cliente;
00015 bool reconocercliente;
00016 bool imprimircliente;
00017 int gclienteadentro = 0;
00018 Timer TimerInterrupcion;
00019 
00020 /*-------------------------------------
00021     VARIABLES GLOBALES
00022   -------------------------------------*/
00023   
00024 DigitalOut Puertas(LED_BLUE);       // Led Azul representa puertas. Encendido = Puertas cerradas. Apagado = Puertas abiertas. Comienza encendido.
00025 bool gbReconocerCliente = false;
00026 bool gbImprimirClientes = false;
00027 int giClientesAdentro = 0;
00028 Timer gtCerrarPuertas;
00029 Timer gtPrintDebounce;
00030  
00031 
00032 /* ---------------------------------------
00033    PROTOTIPOS DE FUNCIONES
00034    ---------------------------------------*/
00035 
00036 void fInterrupcion();
00037 /*Función de Interrupción.
00038 Solicita que se abran las puertas y se
00039 reconozca al cliente.
00040 Regresa:
00041     TRUE si se abrieron las puertas,
00042     FALSE en caso contrario.*/
00043 
00044 void xfAbrirPuertas();
00045 /*Función de Interrupción.
00046 Solicita que se imprima una lista
00047 de clientes dentro de la tienda.*/
00048 
00049 void fReconocerCliente(string * _strpClienteActual);
00050 //Solicita que se cierren las puertas y se salude al cliente.
00051 
00052 
00053 void xfImprimirClientes();
00054 /* Realiza reconocimiento de usuario.
00055 Para esta simulación se solicita el nombre
00056 por comunicación serial.
00057 Argumento:
00058   _strpClienteActual - Guarda aquí el nombre.*/
00059 
00060 void fCerrarPuertas();
00061 //Imprime una lista de clientes.
00062 
00063 void fImprimirClientes(const string * straCliente, int iNumClientes);
00064 
00065 // Alumnos: Solo usen esto si ya comprendieron el concepto de namespace.
00066 using namespace std;
00067  
00068 
00069 /* ---------------------------------------
00070     MAIN
00071    ---------------------------------------*/
00072 
00073 int main()
00074 {
00075     InterruptIn xiClientePorEntrar(PTA13);
00076     InterruptIn xiImprimirClientes(PTD5);
00077  
00078     //Un arreglo es un apuntador con un espacio delimitado:
00079     string straCliente[MAX_CLIENTES];
00080  
00081     int iClienteActual = 0;
00082  
00083     Puertas = 0;
00084  
00085     //Le decimos a InterruptIn qué funciones llamar:
00086     xiClientePorEntrar.rise(&xfAbrirPuertas);
00087     xiImprimirClientes.rise(&xfImprimirClientes);
00088  
00089     while(1) {
00090         //Atender posible solicitud de reconocer a cliente:
00091         if(gbReconocerCliente) {
00092             fReconocerCliente(&straCliente[iClienteActual]);
00093             iClienteActual++;
00094             gbReconocerCliente = false;
00095         }
00096  
00097         //Cerramos las puertas si ya pasaron 5 segundos:
00098         if(gtCerrarPuertas.read() > 5.0f) {
00099             fCerrarPuertas();
00100             gtCerrarPuertas.stop();
00101             gtCerrarPuertas.reset();
00102         }
00103  
00104         // Atender posible solicitud de imprimir clientes:
00105         // En un OS o RTOS esto tendría proridada baja:
00106         if(gbImprimirClientes) {
00107             gtPrintDebounce.start();
00108             fImprimirClientes(straCliente, giClientesAdentro);
00109             gbImprimirClientes = false;
00110         }
00111  
00112  
00113         // Permitimos volver a imprimir la lista:
00114         if(gtPrintDebounce.read() > 2.0f) {
00115             gtPrintDebounce.stop();
00116             gtPrintDebounce.reset();
00117         }
00118     }
00119  
00120     return 0;
00121 }
00122 
00123 /*--------------------------------
00124     Funciones
00125   --------------------------------*/
00126 
00127 void fInterrupcion(){
00128     int x;
00129     interrupcionLED =! interrupcionLED;
00130     TimerInterrupcion.start();
00131     x = TimerInterrupcion.read_ms();
00132     if(x == 1000) 
00133         interrupcionLED =!interrupcionLED;
00134 }
00135 
00136 void xfAbrirPuertas(){
00137 
00138     botton_entrada.rise(fInterrupcion);
00139     if(giClientesAdentro < MAX_CLIENTES && Puertas == 0) {
00140         Puertas = 1;
00141         gbReconocerCliente = true;
00142         gtCerrarPuertas.start();
00143         giClientesAdentro++;
00144     }
00145 }
00146 
00147 void fReconocerCliente(string *_strpClienteActual){
00148     
00149     printf("Nombre: ");
00150     scanf("%s", _strpClienteActual);
00151     printf("\nHasta pronto %s!\n", _strpClienteActual);
00152     fCerrarPuertas();
00153 }
00154 
00155 void xfImprimirClientes(){
00156  
00157     fReconocerCliente(string *_strpClienteActual);
00158     if(gtPrintDebounce.read() == 0.0f) {
00159         gbImprimirClientes = true;
00160     }
00161 }
00162 
00163 void fCerrarPuertas(){
00164     
00165     fImprimirClientes(const string * straCliente, int iNumClientes);
00166     Puertas = 0;
00167 }
00168 
00169 void fImprimirClientes(const string * straCliente, int iNumClientes){
00170     
00171     int i = 0;
00172     printf("Clientes dentro de la tienda: %d\n", iNumClientes);
00173     for(i = 0; i < iNumClientes; i++) {
00174         printf("%s ", *straCliente[i]);
00175     }
00176 }