Andrea Coronado
/
Laboratorio4
Buenas practicas
main.cpp@0:7595691f4c5b, 2014-10-17 (annotated)
- Committer:
- AndreaC
- Date:
- Fri Oct 17 10:37:43 2014 +0000
- Revision:
- 0:7595691f4c5b
Laboratorio_4
Who changed what in which revision?
User | Revision | Line number | New 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 | } |