Buenas practicas

Dependencies:   mbed

Committer:
AndreaC
Date:
Fri Oct 17 10:37:43 2014 +0000
Revision:
0:7595691f4c5b
Laboratorio_4

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AndreaC 0:7595691f4c5b 1 #include "mbed.h"
AndreaC 0:7595691f4c5b 2 #include <iostream>
AndreaC 0:7595691f4c5b 3
AndreaC 0:7595691f4c5b 4 #define MAX_CLIENTES 10
AndreaC 0:7595691f4c5b 5
AndreaC 0:7595691f4c5b 6 /*-------------------------------------
AndreaC 0:7595691f4c5b 7 VARIABLES
AndreaC 0:7595691f4c5b 8 -------------------------------------*/
AndreaC 0:7595691f4c5b 9
AndreaC 0:7595691f4c5b 10 InterruptIn botton_entrada(PTD4);
AndreaC 0:7595691f4c5b 11 DigitalIn botton_salida();
AndreaC 0:7595691f4c5b 12 DigitalOut doPuerta(LED_BLUE);
AndreaC 0:7595691f4c5b 13 DigitalOut interrupcionLED(LED_RED);
AndreaC 0:7595691f4c5b 14 char Nombre_cliente;
AndreaC 0:7595691f4c5b 15 bool reconocercliente;
AndreaC 0:7595691f4c5b 16 bool imprimircliente;
AndreaC 0:7595691f4c5b 17 int gclienteadentro = 0;
AndreaC 0:7595691f4c5b 18 Timer TimerInterrupcion;
AndreaC 0:7595691f4c5b 19
AndreaC 0:7595691f4c5b 20 /*-------------------------------------
AndreaC 0:7595691f4c5b 21 VARIABLES GLOBALES
AndreaC 0:7595691f4c5b 22 -------------------------------------*/
AndreaC 0:7595691f4c5b 23
AndreaC 0:7595691f4c5b 24 DigitalOut Puertas(LED_BLUE); // Led Azul representa puertas. Encendido = Puertas cerradas. Apagado = Puertas abiertas. Comienza encendido.
AndreaC 0:7595691f4c5b 25 bool gbReconocerCliente = false;
AndreaC 0:7595691f4c5b 26 bool gbImprimirClientes = false;
AndreaC 0:7595691f4c5b 27 int giClientesAdentro = 0;
AndreaC 0:7595691f4c5b 28 Timer gtCerrarPuertas;
AndreaC 0:7595691f4c5b 29 Timer gtPrintDebounce;
AndreaC 0:7595691f4c5b 30
AndreaC 0:7595691f4c5b 31
AndreaC 0:7595691f4c5b 32 /* ---------------------------------------
AndreaC 0:7595691f4c5b 33 PROTOTIPOS DE FUNCIONES
AndreaC 0:7595691f4c5b 34 ---------------------------------------*/
AndreaC 0:7595691f4c5b 35
AndreaC 0:7595691f4c5b 36 void fInterrupcion();
AndreaC 0:7595691f4c5b 37 /*Función de Interrupción.
AndreaC 0:7595691f4c5b 38 Solicita que se abran las puertas y se
AndreaC 0:7595691f4c5b 39 reconozca al cliente.
AndreaC 0:7595691f4c5b 40 Regresa:
AndreaC 0:7595691f4c5b 41 TRUE si se abrieron las puertas,
AndreaC 0:7595691f4c5b 42 FALSE en caso contrario.*/
AndreaC 0:7595691f4c5b 43
AndreaC 0:7595691f4c5b 44 void xfAbrirPuertas();
AndreaC 0:7595691f4c5b 45 /*Función de Interrupción.
AndreaC 0:7595691f4c5b 46 Solicita que se imprima una lista
AndreaC 0:7595691f4c5b 47 de clientes dentro de la tienda.*/
AndreaC 0:7595691f4c5b 48
AndreaC 0:7595691f4c5b 49 void fReconocerCliente(string * _strpClienteActual);
AndreaC 0:7595691f4c5b 50 //Solicita que se cierren las puertas y se salude al cliente.
AndreaC 0:7595691f4c5b 51
AndreaC 0:7595691f4c5b 52
AndreaC 0:7595691f4c5b 53 void xfImprimirClientes();
AndreaC 0:7595691f4c5b 54 /* Realiza reconocimiento de usuario.
AndreaC 0:7595691f4c5b 55 Para esta simulación se solicita el nombre
AndreaC 0:7595691f4c5b 56 por comunicación serial.
AndreaC 0:7595691f4c5b 57 Argumento:
AndreaC 0:7595691f4c5b 58 _strpClienteActual - Guarda aquí el nombre.*/
AndreaC 0:7595691f4c5b 59
AndreaC 0:7595691f4c5b 60 void fCerrarPuertas();
AndreaC 0:7595691f4c5b 61 //Imprime una lista de clientes.
AndreaC 0:7595691f4c5b 62
AndreaC 0:7595691f4c5b 63 void fImprimirClientes(const string * straCliente, int iNumClientes);
AndreaC 0:7595691f4c5b 64
AndreaC 0:7595691f4c5b 65 // Alumnos: Solo usen esto si ya comprendieron el concepto de namespace.
AndreaC 0:7595691f4c5b 66 using namespace std;
AndreaC 0:7595691f4c5b 67
AndreaC 0:7595691f4c5b 68
AndreaC 0:7595691f4c5b 69 /* ---------------------------------------
AndreaC 0:7595691f4c5b 70 MAIN
AndreaC 0:7595691f4c5b 71 ---------------------------------------*/
AndreaC 0:7595691f4c5b 72
AndreaC 0:7595691f4c5b 73 int main()
AndreaC 0:7595691f4c5b 74 {
AndreaC 0:7595691f4c5b 75 InterruptIn xiClientePorEntrar(PTA13);
AndreaC 0:7595691f4c5b 76 InterruptIn xiImprimirClientes(PTD5);
AndreaC 0:7595691f4c5b 77
AndreaC 0:7595691f4c5b 78 //Un arreglo es un apuntador con un espacio delimitado:
AndreaC 0:7595691f4c5b 79 string straCliente[MAX_CLIENTES];
AndreaC 0:7595691f4c5b 80
AndreaC 0:7595691f4c5b 81 int iClienteActual = 0;
AndreaC 0:7595691f4c5b 82
AndreaC 0:7595691f4c5b 83 Puertas = 0;
AndreaC 0:7595691f4c5b 84
AndreaC 0:7595691f4c5b 85 //Le decimos a InterruptIn qué funciones llamar:
AndreaC 0:7595691f4c5b 86 xiClientePorEntrar.rise(&xfAbrirPuertas);
AndreaC 0:7595691f4c5b 87 xiImprimirClientes.rise(&xfImprimirClientes);
AndreaC 0:7595691f4c5b 88
AndreaC 0:7595691f4c5b 89 while(1) {
AndreaC 0:7595691f4c5b 90 //Atender posible solicitud de reconocer a cliente:
AndreaC 0:7595691f4c5b 91 if(gbReconocerCliente) {
AndreaC 0:7595691f4c5b 92 fReconocerCliente(&straCliente[iClienteActual]);
AndreaC 0:7595691f4c5b 93 iClienteActual++;
AndreaC 0:7595691f4c5b 94 gbReconocerCliente = false;
AndreaC 0:7595691f4c5b 95 }
AndreaC 0:7595691f4c5b 96
AndreaC 0:7595691f4c5b 97 //Cerramos las puertas si ya pasaron 5 segundos:
AndreaC 0:7595691f4c5b 98 if(gtCerrarPuertas.read() > 5.0f) {
AndreaC 0:7595691f4c5b 99 fCerrarPuertas();
AndreaC 0:7595691f4c5b 100 gtCerrarPuertas.stop();
AndreaC 0:7595691f4c5b 101 gtCerrarPuertas.reset();
AndreaC 0:7595691f4c5b 102 }
AndreaC 0:7595691f4c5b 103
AndreaC 0:7595691f4c5b 104 // Atender posible solicitud de imprimir clientes:
AndreaC 0:7595691f4c5b 105 // En un OS o RTOS esto tendría proridada baja:
AndreaC 0:7595691f4c5b 106 if(gbImprimirClientes) {
AndreaC 0:7595691f4c5b 107 gtPrintDebounce.start();
AndreaC 0:7595691f4c5b 108 fImprimirClientes(straCliente, giClientesAdentro);
AndreaC 0:7595691f4c5b 109 gbImprimirClientes = false;
AndreaC 0:7595691f4c5b 110 }
AndreaC 0:7595691f4c5b 111
AndreaC 0:7595691f4c5b 112
AndreaC 0:7595691f4c5b 113 // Permitimos volver a imprimir la lista:
AndreaC 0:7595691f4c5b 114 if(gtPrintDebounce.read() > 2.0f) {
AndreaC 0:7595691f4c5b 115 gtPrintDebounce.stop();
AndreaC 0:7595691f4c5b 116 gtPrintDebounce.reset();
AndreaC 0:7595691f4c5b 117 }
AndreaC 0:7595691f4c5b 118 }
AndreaC 0:7595691f4c5b 119
AndreaC 0:7595691f4c5b 120 return 0;
AndreaC 0:7595691f4c5b 121 }
AndreaC 0:7595691f4c5b 122
AndreaC 0:7595691f4c5b 123 /*--------------------------------
AndreaC 0:7595691f4c5b 124 Funciones
AndreaC 0:7595691f4c5b 125 --------------------------------*/
AndreaC 0:7595691f4c5b 126
AndreaC 0:7595691f4c5b 127 void fInterrupcion(){
AndreaC 0:7595691f4c5b 128 int x;
AndreaC 0:7595691f4c5b 129 interrupcionLED =! interrupcionLED;
AndreaC 0:7595691f4c5b 130 TimerInterrupcion.start();
AndreaC 0:7595691f4c5b 131 x = TimerInterrupcion.read_ms();
AndreaC 0:7595691f4c5b 132 if(x == 1000)
AndreaC 0:7595691f4c5b 133 interrupcionLED =!interrupcionLED;
AndreaC 0:7595691f4c5b 134 }
AndreaC 0:7595691f4c5b 135
AndreaC 0:7595691f4c5b 136 void xfAbrirPuertas(){
AndreaC 0:7595691f4c5b 137
AndreaC 0:7595691f4c5b 138 botton_entrada.rise(fInterrupcion);
AndreaC 0:7595691f4c5b 139 if(giClientesAdentro < MAX_CLIENTES && Puertas == 0) {
AndreaC 0:7595691f4c5b 140 Puertas = 1;
AndreaC 0:7595691f4c5b 141 gbReconocerCliente = true;
AndreaC 0:7595691f4c5b 142 gtCerrarPuertas.start();
AndreaC 0:7595691f4c5b 143 giClientesAdentro++;
AndreaC 0:7595691f4c5b 144 }
AndreaC 0:7595691f4c5b 145 }
AndreaC 0:7595691f4c5b 146
AndreaC 0:7595691f4c5b 147 void fReconocerCliente(string *_strpClienteActual){
AndreaC 0:7595691f4c5b 148
AndreaC 0:7595691f4c5b 149 printf("Nombre: ");
AndreaC 0:7595691f4c5b 150 scanf("%s", _strpClienteActual);
AndreaC 0:7595691f4c5b 151 printf("\nHasta pronto %s!\n", _strpClienteActual);
AndreaC 0:7595691f4c5b 152 fCerrarPuertas();
AndreaC 0:7595691f4c5b 153 }
AndreaC 0:7595691f4c5b 154
AndreaC 0:7595691f4c5b 155 void xfImprimirClientes(){
AndreaC 0:7595691f4c5b 156
AndreaC 0:7595691f4c5b 157 fReconocerCliente(string *_strpClienteActual);
AndreaC 0:7595691f4c5b 158 if(gtPrintDebounce.read() == 0.0f) {
AndreaC 0:7595691f4c5b 159 gbImprimirClientes = true;
AndreaC 0:7595691f4c5b 160 }
AndreaC 0:7595691f4c5b 161 }
AndreaC 0:7595691f4c5b 162
AndreaC 0:7595691f4c5b 163 void fCerrarPuertas(){
AndreaC 0:7595691f4c5b 164
AndreaC 0:7595691f4c5b 165 fImprimirClientes(const string * straCliente, int iNumClientes);
AndreaC 0:7595691f4c5b 166 Puertas = 0;
AndreaC 0:7595691f4c5b 167 }
AndreaC 0:7595691f4c5b 168
AndreaC 0:7595691f4c5b 169 void fImprimirClientes(const string * straCliente, int iNumClientes){
AndreaC 0:7595691f4c5b 170
AndreaC 0:7595691f4c5b 171 int i = 0;
AndreaC 0:7595691f4c5b 172 printf("Clientes dentro de la tienda: %d\n", iNumClientes);
AndreaC 0:7595691f4c5b 173 for(i = 0; i < iNumClientes; i++) {
AndreaC 0:7595691f4c5b 174 printf("%s ", *straCliente[i]);
AndreaC 0:7595691f4c5b 175 }
AndreaC 0:7595691f4c5b 176 }