Prototipo_SantaAna

Dependencies:   BatteryPanel_St_An Slave_St_An mbed GraphicLCD_St_An ThermalPrinter_St_An LimitSwtiches

Files at this revision

API Documentation at this revision

Comitter:
williequesada
Date:
Tue Jun 04 17:45:47 2019 +0000
Commit message:
pablo

Changed in this revision

BatteryPanel.lib Show annotated file Show diff for this revision Revisions of this file
GraphicLCD.lib Show annotated file Show diff for this revision Revisions of this file
LimitSwtiches.lib Show annotated file Show diff for this revision Revisions of this file
Slave.lib Show annotated file Show diff for this revision Revisions of this file
ThermalPrinter.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r a37ed180e6e3 BatteryPanel.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BatteryPanel.lib	Tue Jun 04 17:45:47 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/williequesada/code/BatteryPanel_St_An/#fe4a274c3785
diff -r 000000000000 -r a37ed180e6e3 GraphicLCD.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GraphicLCD.lib	Tue Jun 04 17:45:47 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/williequesada/code/GraphicLCD_St_An/#ce5c0fc9a64f
diff -r 000000000000 -r a37ed180e6e3 LimitSwtiches.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LimitSwtiches.lib	Tue Jun 04 17:45:47 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/williequesada/code/LimitSwtiches/#a298c2462f4f
diff -r 000000000000 -r a37ed180e6e3 Slave.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Slave.lib	Tue Jun 04 17:45:47 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/williequesada/code/Slave_St_An/#cb801dad3124
diff -r 000000000000 -r a37ed180e6e3 ThermalPrinter.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ThermalPrinter.lib	Tue Jun 04 17:45:47 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/williequesada/code/ThermalPrinter_St_An/#c6a99e05245f
diff -r 000000000000 -r a37ed180e6e3 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Jun 04 17:45:47 2019 +0000
@@ -0,0 +1,3706 @@
+#include    "mbed.h"
+#include    <string>
+
+#include    "BatteryPanel.h"
+#include    "ThermalPrinter.h"
+#include    "LimitSwitches.h"
+#include    "GraphicLCD.h"
+//#include    "KeyPad.h"
+#include    "Slave.h"
+
+#define     NO_KEY              0x00
+#define     NO_DATA             0x87
+
+#define     COMMAND_ON          0X70
+#define     COMMAND_INIT        0X71
+#define     COMMAND_GPRS        0X72
+#define     COMMAND_DATA        0X73
+#define     COMMAND_POST        0X74
+#define     COMMAND_ANSWER      0X75
+#define     COMMAND_SIGNAL      0X76
+#define     COMMAND_CONNECT     0X77
+#define     COMMAND_OFF         0X78
+#define     HOSTING_STEP1       0x79
+#define     HOSTING_STEP2       0x7A
+#define     HOSTING_STEP3       0x7B
+#define     HOSTING_STEP4       0x7C
+#define     HOSTING_STEP5       0x7D
+#define     HOSTING_STEP6       0x7E
+#define     HOSTING_STEP7       0x7F
+#define     HOSTING_STEP8       0x80
+#define     HOSTING_STEP9       0x81
+#define     HOSTING_STEP10      0x82
+#define     HOSTING_STEP11      0x83
+#define     HOSTING_OFF         0x84
+#define     NEXT_STEP           0x85
+#define     NEXT_SLEEP          0x86
+#define     COMMAND_END         0X88
+
+#define     USER_INIT           0xA0
+#define     USER_PLACE          0xA1
+#define     USER_CARD           0xA2
+#define     USER_TIME           0xA3
+#define     USER_DATA           0xA4
+#define     USER_PRINT          0xA5
+#define     USER_TICKET         0xA6
+#define     USER_FINISH         0xA7
+#define     USER_POST           0xA8
+#define     USER_ANSWER         0xA9
+#define     USER_INIT2          0xAA
+#define     USER_INIT3          0xB0
+#define     USER_INIT4          0xB1
+#define     USER_CARD2          0xB2
+#define     USER_INIT5          0xB3
+#define     USER_CARD3          0xB4
+
+#define     M_SISTEMA           0x40
+#define     M_RED               0x41
+#define     M_IMPRESORA         0x42
+#define     M_TECLADO           0x43
+#define     M_LECTORA           0X44
+#define     M_INFORMACION       0x45
+#define     M_OFF               0x46
+#define     M_PARQUIMETRO       0x47
+#define     M_MUNICIPIO         0x48
+#define     M_PRECIO            0x49
+#define     M_ATRAS             0x4A
+#define     M_SENAL             0x4B
+#define     M_HOSTING           0x4C
+#define     M_CONEXION_SIM      0x4E
+#define     M_PAPEL             0x4F
+#define     M_IMPRESION         0x50
+#define     M_CONEXION_IMP      0x51
+#define     M_LECTURA           0x52
+#define     M_CONEXION_LEC      0x53
+#define     M_PRUEBA_TECLA      0x54
+
+BATTERY_PANEL Charger(PF_9, PF_7, PG_1);
+// BATTERY_PANEL Charger(AnalogBattery, AnalogPanel, ControlCarga);
+
+GLCD         Screen(PD_8,PE_10,PD_9,PE_12,PE_8,PE_14,PE_7,PE_15,PE_9,PE_11,PF_15,PE_13,PF_13,PB_1,PF_14);
+// CLASS     GLCD(D1,D2,D3,D4,D5,D6,D7,D8,CD,RESET,CE,WR,RD)
+
+// KEYPAD       KeyPad(PF_0,PE_3,PF_1,PE_6,PE_5,PF_2,PE_4,PB_6);
+// CLASS     KEYPAD(F1,F2,F3,F4,C1,C2,C3,C4);
+
+PRINTER      Impresora(PC_10,PC_11,PE_0,PB_10,PB_0,PC_2);
+// CLASS     PRINTER(TX,RX,PAPER,SELECT,RESET,POWER)
+
+SLAVE        Slave(PD_5,PD_6,PD_7);
+// CLASS     SLAVE(TX,RX,AWAKE)
+
+SWITCHES     Doors(PC_4,PC_1);
+// CLASS     SWITCHES(SENSOR1,SENSOR2)
+
+RawSerial    CardReader(PC_12,PD_2,9600);
+// Serial    CardReader(TX,RX,BAUT);
+
+Serial       Computer(USBTX,USBRX,9600);
+
+InterruptIn  Configuracion(USER_BUTTON);
+DigitalOut   CardReaderPower(PF_3);//
+
+DigitalOut   MAX232(PC_8);
+DigitalOut   Keypad_F1(PF_0);
+DigitalOut   Keypad_F2(PE_3);
+DigitalOut   Keypad_F3(PF_1);
+DigitalOut   Keypad_F4(PF_8);//
+InterruptIn  Keypad_C1(PA_0);//PE_5
+InterruptIn  Keypad_C2(PE_6);//PF_2
+InterruptIn  Keypad_C3(PC_5);//PE_4
+InterruptIn  Keypad_C4(PA_2);//PB_6
+
+//-----------------------Conexiones GLCD T6963C---------------------------------
+//          1  2       Vss Vss          Ti  Ti(NO Conectada)
+//          3  4       Vcc Cte          Vc  Po
+//          5  6       WR  RD           D14 D15
+//          7  8       CE  CD           F12 F13
+//          9  10      -V  RST          Po  E9
+//          11 12      D0  D1           E11 F14
+//          13 14      D2  D3           E13 F15
+//          15 16      D4  D5           D8  D9
+//          17 18      D6  D7           E8  E7
+//          19 20      NC  NC
+//
+//-----------Conexiones Usadas---------  //-------Conexiones Usadas STM32-------
+//              ____________             //             ___________
+//               2  4  6  8              //             F8 F5 F2 F0
+//               1  3  5  7              //             F9 F7 F3 F1
+//              ____________             //             ___________
+//                  APEM                 //                 APEM
+//          Serial number 12470157       //         Serial number 12470157
+//-------------------------------------  //-------------------------------------
+//
+//------------------------CONEXIONES FUJITSU SERIAL PRINTER---------------------
+// Conector RS232C(ZHR-8)
+//   _ _ _ _ _ _ _ _
+//  ! ! ! ! ! ! ! ! !             1->RXD    2->TXD    3->DTR    4->GND
+//   1 2 3 4 5 6 7 8              5->DST    6->SLCTIN 7->INPRM  8->AFT
+//
+// Conector Power(PHR-2)
+//   _ _ _ _ _ _
+//  ! ! ! ! ! ! !             1->VCC Logic Supply    2->GND Logic
+//   1 2 3 4 5 6            4,3->GND Head/Motor    5,6->VCC Head/Motor
+
+DigitalOut   LedMantenimiento(LED1);
+DigitalOut   LedHosting(LED2);
+DigitalOut   LedUsuario(LED3);
+
+const char SOH=1;
+const char EOT=4;
+const char ADDR=0;
+const char LEN=0;
+const char CARD_POSITION='8';
+const char DEV_RESET=127;
+const char ARM_MODE='P';
+const char ARM_DEBUG='p';
+const char ARM_ABORT=27;
+const char MAG_ISO_T2='R';
+const char BBCA='=';
+const char BBCE='U';
+const char BBCF='u';
+const char BBCG=30;
+const char BBCI='z';
+const char BBCK='W';
+const char R_ACTION='^';
+const char R_ERROR='*';
+const char R_INVALID='!';
+const char R_NO_DATA='+';
+const char R_COMAND_ERROR='?';
+const char R_START=':';
+const char R_POSITION1='q';
+const char R_POSITION2='s';
+const char R_NO_MAG_CARD='>';
+const char R_MAG_DETECT_ON='(';
+const char R_MAG_DETECT_OFF=')';
+
+char StateReader[7]= {'0','0','0','0','0','0','0'};
+char CardReader_Buffer[255];
+int  CardReader_Counter=0;
+
+char Tecla;
+char Tecla_Before;
+char Comando;
+char InByte;
+uint32_t Inicio, Fin, Transcurrido;
+
+char Tiempo[6];
+char Importe[8];
+char Espacio[6];
+char HoraRespuesta[6]="00:00";
+char HoraFinal[6]="00:00";
+char Parquimetro[5]="1067";
+char Municipio[10]="Santa Ana";//"San Jose";
+char CodigoMunicipio[3]="01";
+char NumeroRespuesta[7]="000000";
+char FechaRespuesta[11]="00-00-0000";
+char Track2[22]="5303105315252296=2108";
+char Alarmas[7]="AAAAAA";
+char PapelDisponible[5]="0000";
+char Clave[4]= {'4','3','2','1'};
+char RespuestaHosting[7]="      ";
+char HoraHosting[7]="     ";
+char Progreso[3];
+int  Counter_Host=1318;
+int  Precio=350;
+int  TiempoMinutos;
+int  Papel=4000;
+int  Hostin_Conection=1320;
+bool Alarm=0;
+bool MantenimientoInterruption=0;
+int  HoraHostingPantalla=1000;
+int  MinutosTranscurrido=11;
+int  Battery_State;
+int  Battery_State_Before=1;
+float Battery_Voltage;
+float Panel_Voltage;
+
+
+//LowPowerTicker Host;
+//LowPowerTimer  BaseClock;
+Ticker Host;
+Timer  BaseClock;
+
+void Keypad_Init()
+{
+    Tecla_Before=NO_KEY;
+    Keypad_F1=0;
+    Keypad_F2=0;
+    Keypad_F3=0;
+    Keypad_F4=0;
+}
+
+char KeyPad_Read(void)
+{
+    Keypad_F1=1;
+    Keypad_F2=0;
+    Keypad_F3=0;
+    Keypad_F4=0;
+    wait_us(10);
+    if(Keypad_C1.read()) {
+        if(Tecla_Before!='1') {
+            Tecla_Before='1';
+            return '1';
+        } else {
+            return NO_KEY;
+        }
+    }
+    if(Keypad_C2.read()) {
+        if(Tecla_Before!='2') {
+            Tecla_Before='2';
+            return '2';
+        } else {
+            return NO_KEY;
+        }
+    }
+    if(Keypad_C3.read()) {
+        if(Tecla_Before!='3') {
+            Tecla_Before='3';
+            return '3';
+        } else {
+            return NO_KEY;
+        }
+    }
+    if(Keypad_C4.read()) {
+        if(Tecla_Before!='A') {
+            Tecla_Before='A';
+            return 'A';
+        } else {
+            return NO_KEY;
+        }
+    }
+
+    Keypad_F1=0;
+    Keypad_F2=1;
+    Keypad_F3=0;
+    Keypad_F4=0;
+    wait_us(10);
+    if(Keypad_C1.read()) {
+        if(Tecla_Before!='4') {
+            Tecla_Before='4';
+            return '4';
+        } else {
+            return NO_KEY;
+        }
+    }
+    if(Keypad_C2.read()) {
+        if(Tecla_Before!='5') {
+            Tecla_Before='5';
+            return '5';
+        } else {
+            return NO_KEY;
+        }
+    }
+    if(Keypad_C3.read()) {
+        if(Tecla_Before!='6') {
+            Tecla_Before='6';
+            return '6';
+        } else {
+            return NO_KEY;
+        }
+    }
+    if(Keypad_C4.read()) {
+        if(Tecla_Before!='B') {
+            Tecla_Before='B';
+            return 'B';
+        } else {
+            return NO_KEY;
+        }
+    }
+
+    Keypad_F1=0;
+    Keypad_F2=0;
+    Keypad_F3=1;
+    Keypad_F4=0;
+    wait_us(10);
+    if(Keypad_C1.read()) {
+        if(Tecla_Before!='7') {
+            Tecla_Before='7';
+            return '7';
+        } else {
+            return NO_KEY;
+        }
+    }
+    if(Keypad_C2.read()) {
+        if(Tecla_Before!='8') {
+            Tecla_Before='8';
+            return '8';
+        } else {
+            return NO_KEY;
+        }
+    }
+    if(Keypad_C3.read()) {
+        if(Tecla_Before!='9') {
+            Tecla_Before='9';
+            return '9';
+        } else {
+            return NO_KEY;
+        }
+    }
+    if(Keypad_C4.read()) {
+        if(Tecla_Before!='C') {
+            Tecla_Before='C';
+            return 'C';
+        } else {
+            return NO_KEY;
+        }
+    }
+
+    Keypad_F1=0;
+    Keypad_F2=0;
+    Keypad_F3=0;
+    Keypad_F4=1;
+    wait_us(10);
+    if(Keypad_C1.read()) {
+        if(Tecla_Before!='F') {
+            Tecla_Before='F';
+            return 'F';
+        } else {
+            return NO_KEY;
+        }
+    }
+    if(Keypad_C2.read()) {
+        if(Tecla_Before!='0') {
+            Tecla_Before='0';
+            return '0';
+        } else {
+            return NO_KEY;
+        }
+    }
+    if(Keypad_C3.read()) {
+        if(Tecla_Before!='E') {
+            Tecla_Before='E';
+            return 'E';
+        } else {
+            return NO_KEY;
+        }
+    }
+    if(Keypad_C4.read()) {
+        if(Tecla_Before!='D') {
+            Tecla_Before='D';
+            return 'D';
+        } else {
+            return NO_KEY;
+        }
+    }
+
+    Tecla_Before=NO_KEY;
+    return NO_KEY;
+}
+
+void KeyPad_InterruptDisable()
+{
+    Keypad_C1.disable_irq();
+    Keypad_C2.disable_irq();
+    Keypad_C3.disable_irq();
+    Keypad_C4.disable_irq();
+}
+
+void KeyPad_InterruptEnable()
+{
+    Keypad_C1.enable_irq();
+    Keypad_C2.enable_irq();
+    Keypad_C3.enable_irq();
+    Keypad_C4.enable_irq();
+    Keypad_F1=1;
+    Keypad_F2=1;
+    Keypad_F3=1;
+    Keypad_F4=1;
+}
+//-----------------------------------------------------------------------------------------------------------------------------------------------------
+void PantallaInicio()
+{
+    Computer.printf("Pantala de Inicio\n");
+
+    Screen.Limits();
+    Screen.PutString(45,19,"Prueba E-Park");
+    Screen.Show();
+    wait_ms(2000);
+
+    Screen.Limits();
+    Screen.PutString(58,12,"Grupo Setex");
+    Screen.PutString(65,34,"Costa Rica");
+    Screen.Show();
+    wait_ms(3000);
+}
+
+void AlarmasCall(int Periferico,bool Estado)
+{
+    // 1 -> Lector
+    // 2 -> Impresora
+    // 3 -> Papel
+    // 4 -> Puerta1
+    // 5 -> Puerta2
+    // 6 -> Bateria
+    if(Estado) {
+        Alarmas[Periferico-1]='E';
+        Alarm=1;
+    } else {
+        Alarmas[Periferico-1]='A';
+    }
+}
+
+char GetTime(char Salida,uint32_t TimeOut)
+{
+    bool Salir;
+    bool Finalizar;
+    bool Agregar;
+    bool Restar;
+    int PositionTime=3;
+    int Hora=PositionTime/6;
+    int Minuto=(PositionTime%6)*10;
+    int Costo=(PositionTime/3)*Precio;
+
+    Tiempo[0]='0';
+    Tiempo[1]=':';
+    Tiempo[2]='3';
+    Tiempo[3]='0';
+    Tiempo[4]=' ';
+    Tiempo[5]='\0';
+    
+    sprintf(Importe,"%i*",Costo);
+
+    Screen.PutString(15,12,"Tiempo:");
+    Screen.PutString(88,12,Tiempo);
+    Screen.PutString(15,34,"Precio:");
+    Screen.PutString(85,34,Importe);
+    Screen.PutString(141,46,"Confirmar");
+    Screen.Limits();
+    Screen.Show();
+
+    if(Computer.writeable()) {
+        Computer.printf("Tiempo y precio \n");
+        Computer.printf(Tiempo);
+        Computer.printf(" ");
+        Computer.printf(Importe);
+        Computer.printf("\n");
+    }
+    Inicio=BaseClock.read_ms();
+    Keypad_Init();
+    while(true) {
+
+        Fin=BaseClock.read_ms();
+        Transcurrido=Fin-Inicio;
+        if(Transcurrido>TimeOut) {
+            Screen.Clean();
+            return USER_FINISH;
+        }
+
+        Tecla=KeyPad_Read();
+        if (Tecla!=NO_KEY) {                            // Se valida que se ingrese una tecla valida por el teclado
+            Inicio=BaseClock.read_ms();
+
+            Agregar=(Tecla=='E');
+            if ((Agregar)&&(PositionTime<72)) {         // Sumar 30 minutos, maximos 12 horas
+                PositionTime+=3;
+            }
+            Restar=((Tecla=='F')&&(PositionTime>3));    // Restar 10 minutos, minimo 30 minutos
+            if (Restar) {
+                PositionTime-=3;
+            }
+            Salir=(Tecla=='C');                         // Cancelar operacion
+            if (Salir) {
+                Screen.Clean();
+                return USER_FINISH;
+            }
+            Finalizar=(Tecla=='D');                     // En caso de confirmacion
+            if (Finalizar) {
+                Screen.PutString(15,12,"Realizando");
+                Screen.PutString(15,34,"Operacion...");
+                Screen.PutChar(84,33,'!');
+                Screen.Limits();
+                Screen.Show();
+                return Salida;
+            }
+
+            Hora=PositionTime/6;
+            Minuto=(PositionTime%6)*10;
+            Costo=(PositionTime/3)*Precio;
+            if(Minuto==0) {                             // Calcular tiempo en horas y minutos
+                sprintf(Tiempo,"%i:0%i",Hora,Minuto);
+                sprintf(Importe,"%i*",Costo);
+            } else {
+                sprintf(Tiempo,"%i:%i",Hora,Minuto);
+                sprintf(Importe,"%i*",Costo);
+            }
+            TiempoMinutos=PositionTime*10;
+
+            //-------Mostrar en Patalla-------
+            Screen.PutString(15,12,"Tiempo:");
+            Screen.PutString(88,12,Tiempo);
+            Screen.PutString(15,34,"Precio:");
+            Screen.PutString(85,34,Importe);
+            Screen.PutString(141,46,"Confirmar");
+            Screen.Limits();
+            Screen.Show();
+
+            if(Computer.writeable()) {
+                Computer.printf(Tiempo);
+                Computer.printf(" ");
+                Computer.printf(Importe);
+                Computer.printf("\n");
+            }
+        }
+    }
+}
+
+char GetPlace(char Salida,uint32_t TimeOut)
+{
+    bool    Numero;
+    bool    Borrar;
+    bool    Finalizar;
+    bool    Salir;
+    uint8_t PositionPlace=0;
+
+    Espacio[0]='_';
+    Espacio[1]=' ';
+    Espacio[2]=' ';
+    Espacio[3]=' ';
+    Espacio[4]=' ';
+    Espacio[5]='\0';
+
+    Screen.Limits();
+    Screen.PutString(15,12,"Numero de espacio:");
+    Screen.PutChar(28,11,'!');
+    Screen.PutString(15,34,Espacio);
+    Screen.Show();
+
+    if(Computer.writeable()) {
+        Computer.printf("Obteniendo numero de espacio:\n");
+        Computer.printf("%s \n",Espacio);
+    }
+    Inicio=BaseClock.read_ms();
+    Keypad_Init();
+    while(true) {
+
+        Fin=BaseClock.read_ms();
+        Transcurrido=Fin-Inicio;
+        if(Transcurrido>TimeOut) {
+            Screen.Clean();
+            return USER_FINISH;
+        }
+
+        Tecla=KeyPad_Read();
+        if (Tecla!=NO_KEY) {                                        // Se valida que se ingrese una tecla valida
+            Inicio=BaseClock.read_ms();
+
+            Numero=(Tecla=='0')||(Tecla=='1')||(Tecla=='2')||(Tecla=='3')||(Tecla=='4')||(Tecla=='5')||(Tecla=='6')||(Tecla=='7')||(Tecla=='8')||(Tecla=='9');
+            if ((Numero)&&(PositionPlace<4)) {                      //Agregar un digito
+                Espacio[PositionPlace]=Tecla;
+                PositionPlace++;
+                Espacio[PositionPlace]='_';
+                Espacio[4]=' ';
+            }
+            Borrar=(Tecla=='B')&&(PositionPlace>0);
+            if (Borrar) {                                           //Borrar el ultimo digito
+                Espacio[PositionPlace]=' ';
+                PositionPlace--;
+                Espacio[PositionPlace]='_';
+                Espacio[4]=' ';
+            }
+            Salir=(Tecla=='C');                                     //Cancelar operacion
+            if (Salir) {
+                Screen.Clean();
+                return USER_FINISH;
+            }
+            Finalizar=((Tecla=='D')&&(PositionPlace==4));           //En caso de confirmacion
+            if (Finalizar) {
+                return Salida;
+            }
+            if(PositionPlace==4) {                                 //Se debe confirmar cuando estan los 4 digitos
+                Screen.Limits();
+                Screen.PutString(15,12,"Numero de espacio:");
+                Screen.PutChar(28,11,'!');
+                Screen.PutString(15,34,Espacio);
+                Screen.PutString(141,46,"Confirmar");
+                Screen.Show();
+            } else {
+                Screen.Limits();
+                Screen.PutString(15,12,"Numero de espacio:");
+                Screen.PutChar(28,11,'!');
+                Screen.PutString(15,34,Espacio);
+                Screen.Show();
+            }
+            Computer.printf("%s\n",Espacio);
+        }
+    }
+}
+
+
+void Interrupt_CardReader()
+{
+    if(CardReader.readable()) {
+        CardReader_Buffer[CardReader_Counter]=CardReader.getc();
+        CardReader_Counter++;
+    }
+}
+
+int ResetCard()
+{
+    CardReader_Counter=0;
+    StateReader[0]='S';
+    Computer.printf("\n Reset card reader");
+    if(CardReader.writeable()) {
+        CardReader.putc(SOH);           // 00000001
+        CardReader.putc(ADDR);          // 00000000
+        CardReader.putc(LEN);           // 00000000
+        CardReader.putc(LEN);           // 00000000
+        CardReader.putc(DEV_RESET);     // 01111111
+        CardReader.putc(EOT);           // 00000100
+        CardReader.putc(BBCI);          // 01111010
+    }
+    wait_ms(2000);
+    for(int i=0; i<=CardReader_Counter; i++) {
+        if(CardReader_Buffer[i]==R_START) {
+            Computer.printf("\n START");            // Encendido
+            StateReader[0]='A';
+            AlarmasCall(1,0);
+            return 1;
+        }
+        if(CardReader_Buffer[i]==R_INVALID) {
+            Computer.printf("\n INVALID ");         // Comando Invalido
+            StateReader[0]='N';
+            AlarmasCall(1,1);
+            return 0;
+        }
+        if(CardReader_Buffer[i]==R_ERROR) {
+            Computer.printf("\n ERROR ");           // Error
+            StateReader[0]='E';
+            AlarmasCall(1,1);
+            return 0;
+        }
+        if(CardReader_Buffer[i]==R_COMAND_ERROR) {
+            Computer.printf("\n COMAND ERROR ");    // Error en comando
+            StateReader[0]='C';
+            AlarmasCall(1,1);
+            return 0;
+        }
+    }
+    AlarmasCall(1,1);
+    return 0;
+}
+
+void DetectionCard(uint32_t TimeOut)
+{
+    CardReader_Counter=0;
+    StateReader[1]='S';
+    StateReader[2]='S';
+    StateReader[3]='S';
+    if(StateReader[0]=='A') {               // Se envia el comando Arm Debug
+        Computer.printf("\n Introducir tarjeta");
+        if(CardReader.writeable()) {
+            CardReader.putc(SOH);
+            CardReader.putc(ADDR);
+            CardReader.putc(LEN);
+            CardReader.putc(LEN);
+            CardReader.putc(ARM_DEBUG);
+            CardReader.putc(EOT);
+            CardReader.putc(BBCF);
+        }
+        wait_ms(500);
+        for(int i=0; i<=CardReader_Counter; i++) {
+            if(CardReader_Buffer[i]==R_ACTION) {
+                Computer.printf("\n ACTION ");      // Accion ejecutada
+                StateReader[1]='A';
+            }
+            if(CardReader_Buffer[i]==R_INVALID) {
+                Computer.printf("\n INVALID ");     // Comando Invalido
+                StateReader[1]='N';
+            }
+            if(CardReader_Buffer[i]==R_ERROR) {
+                Computer.printf("\n ERROR ");       // Error
+                StateReader[1]='E';
+            }
+            if(CardReader_Buffer[i]==R_COMAND_ERROR) {
+                Computer.printf("\n COMAND ERROR ");// Error en comando
+                StateReader[1]='C';
+            }
+        }
+        CardReader_Counter=0;
+
+        Inicio=BaseClock.read_ms();
+        while(CardReader_Counter==0) {       // Esperando introduccion de tarjeta
+            Fin=BaseClock.read_ms();
+            Transcurrido=Fin-Inicio;
+            if(StateReader[1]=='C'||StateReader[1]=='E'||StateReader[1]=='N') {
+                Computer.printf("\n Error en comando");
+                break;
+            }
+            if(StateReader[1]=='S') {
+                Computer.printf("\n Sin respuesta");
+                break;
+            }
+            Tecla=KeyPad_Read();
+            if(Tecla=='C') {
+                Computer.printf("\n Cancelar operacion");
+                if(CardReader.writeable()) {
+                    CardReader.putc(SOH);
+                    CardReader.putc(ADDR);
+                    CardReader.putc(LEN);
+                    CardReader.putc(LEN);
+                    CardReader.putc(ARM_ABORT);
+                    CardReader.putc(EOT);
+                    CardReader.putc(BBCG);
+                }
+                break;
+            }
+            if(Transcurrido>TimeOut) {
+                Computer.printf("\n Tiempo de respuesta");
+                if(CardReader.writeable()) {
+                    CardReader.putc(SOH);
+                    CardReader.putc(ADDR);
+                    CardReader.putc(LEN);
+                    CardReader.putc(LEN);
+                    CardReader.putc(ARM_ABORT);
+                    CardReader.putc(EOT);
+                    CardReader.putc(BBCG);
+                }
+                break;
+            }
+        }
+        wait_ms(1000);
+        for(int i=0; i<=CardReader_Counter; i++) {
+            Computer.printf("%c",CardReader_Buffer[i]);
+            if(CardReader_Buffer[i]==R_NO_MAG_CARD) {
+                Computer.printf("\n Deteccion nula ");      // No se detecta banda magnetica
+                StateReader[2]='N';
+                StateReader[3]='N';
+            }
+            if(CardReader_Buffer[i]==R_MAG_DETECT_ON) {
+                Computer.printf("\n Deteccion on ");        // Se inicia verificacion de banda
+                StateReader[2]='A';
+            }
+            if(CardReader_Buffer[i]==R_MAG_DETECT_OFF) {
+                Computer.printf("\n Deteccion off ");       // Se termina verificacion de banda
+                StateReader[3]='A';
+            }
+            if(CardReader_Buffer[i]==R_ACTION) {
+                Computer.printf("\n Action arm abort ");    // Accion ejecutada
+                StateReader[1]='T';
+            }
+        }
+    }
+}
+
+int PositionCard()
+{
+    CardReader_Counter=0;
+    StateReader[4]='S';
+    Computer.printf("\n Detectando tarjeta");
+    if(CardReader.writeable()) {
+        CardReader.putc(SOH);
+        CardReader.putc(ADDR);
+        CardReader.putc(LEN);
+        CardReader.putc(LEN);
+        CardReader.putc(CARD_POSITION);
+        CardReader.putc(EOT);
+        CardReader.putc(BBCA);
+    }
+    wait_ms(200);
+    for(int i=0; i<=CardReader_Counter; i++) {
+        Computer.printf("%c",CardReader_Buffer[i]);
+        if(CardReader_Buffer[i]==R_POSITION1) {
+            Computer.printf("\n Tarjeta en posicion incorrecta ");   // Mal colocada la tarjeta
+            StateReader[4]='N';
+            return 0;
+        }
+        if(CardReader_Buffer[i]==R_POSITION2) {
+            Computer.printf("\n Tarjeta en posicion correcta ");     // Bien colocada la tarjeta
+            StateReader[4]='A';
+            return 1;
+        }
+    }
+    return 0;
+}
+
+uint8_t ReadCard(uint32_t TimeOut)
+{
+    CardReader_Counter=0;
+    StateReader[5]='S';
+    StateReader[6]='S';
+    if(StateReader[4]=='A') {
+        Computer.printf("\n Retirar Tarjeta en un solo movimiento");
+        if(CardReader.writeable()) {
+            CardReader.putc(SOH);
+            CardReader.putc(ADDR);
+            CardReader.putc(LEN);
+            CardReader.putc(LEN);
+            CardReader.putc(ARM_MODE);
+            CardReader.putc(EOT);
+            CardReader.putc(BBCE);
+        }
+        wait_ms(300);
+        for(int i=0; i<=CardReader_Counter; i++) {
+            Computer.printf("%c",CardReader_Buffer[i]);
+            if(CardReader_Buffer[i]==R_ACTION) {
+                Computer.printf("\n ACTION ");      // Accion ejecutada
+                StateReader[5]='A';
+            }
+            if(CardReader_Buffer[i]==R_INVALID) {
+                Computer.printf("\n INVALID ");     // Comando Invalido
+                StateReader[5]='N';
+            }
+            if(CardReader_Buffer[i]==R_ERROR) {
+                Computer.printf("\n ERROR ");       // Error
+                StateReader[5]='E';
+            }
+            if(CardReader_Buffer[i]==R_COMAND_ERROR) {
+                Computer.printf("\n COMAND ERROR ");// Error en comando
+                StateReader[5]='C';
+            }
+        }
+        CardReader_Counter=0;
+        Inicio=BaseClock.read_ms();
+        Keypad_Init();
+        while(CardReader_Counter==0) {       // Esperando introduccion de tarjeta
+            Fin=BaseClock.read_ms();
+            Transcurrido=Fin-Inicio;
+            if(StateReader[5]=='C'||StateReader[5]=='E'||StateReader[5]=='N') {
+                Computer.printf("\n Error en comando");
+                break;
+            }
+            if(StateReader[5]=='S') {
+                Computer.printf("\n Sin Respuesta");
+                break;
+            }
+            if(Transcurrido>TimeOut) {
+                Computer.printf("\n Tiempo de respuesta superado");
+                if(CardReader.writeable()) {
+                    CardReader.putc(SOH);
+                    CardReader.putc(ADDR);
+                    CardReader.putc(LEN);
+                    CardReader.putc(LEN);
+                    CardReader.putc(ARM_ABORT);
+                    CardReader.putc(EOT);
+                    CardReader.putc(BBCG);
+                }
+                StateReader[5]='T';
+                break;
+            }
+            Tecla=KeyPad_Read();
+            if(Tecla=='C') {
+                Computer.printf("\n Cancelar operacion");
+                if(CardReader.writeable()) {
+                    CardReader.putc(SOH);
+                    CardReader.putc(ADDR);
+                    CardReader.putc(LEN);
+                    CardReader.putc(LEN);
+                    CardReader.putc(ARM_ABORT);
+                    CardReader.putc(EOT);
+                    CardReader.putc(BBCG);
+                }
+                StateReader[5]='T';
+                return 2;
+            }
+        }
+        wait_ms(200);
+        for(int i=0; i<=CardReader_Counter; i++) {
+            Computer.printf("%c",CardReader_Buffer[i]);
+            Computer.printf("-%2X-",CardReader_Buffer[i]);
+            if(CardReader_Buffer[i]==R_NO_MAG_CARD) {
+                Computer.printf("\n DETECCION NULA ");      // No se detecta banda magnetica
+                StateReader[6]='N';
+                return 0;
+            }
+            if(CardReader_Buffer[i]==R_ACTION) {
+                Computer.printf("\n TARJETA LEIDA ");       // Tarjeta leida
+                StateReader[6]='A';
+                return 1;
+            }
+            if(CardReader_Buffer[i]==R_INVALID) {
+                Computer.printf("\n INVALID ");             // Comando Invalido
+                StateReader[6]='N';
+                return 0;
+            }
+            if(CardReader_Buffer[i]==R_ERROR) {
+                Computer.printf("\n ERROR ");               // Error
+                StateReader[6]='E';
+            }
+            if(CardReader_Buffer[i]==R_COMAND_ERROR) {
+                Computer.printf("\n COMAND ERROR ");        // Error en comando
+                StateReader[6]='C';
+                return 0;
+            }
+        }
+    }
+    return 0;
+}
+
+uint8_t RecibeDataCard()
+{
+    if (StateReader[6]=='A') {
+        CardReader_Counter=0;
+        if(CardReader.writeable()) {
+            CardReader.putc(SOH);               // 00000001
+            CardReader.putc(ADDR);              // 00000000
+            CardReader.putc(LEN);               // 00000000
+            CardReader.putc(LEN);               // 00000000
+            CardReader.putc(MAG_ISO_T2);        // 01010101
+            CardReader.putc(EOT);               // 00000100
+            CardReader.putc(BBCK);
+        }
+        wait_ms(200);
+        for(int i=0; i<=CardReader_Counter; i++) {
+            if(CardReader_Buffer[i]==R_NO_DATA) {
+                Computer.printf("Sin lectura\n");
+                return 2;
+            }
+            if(CardReader_Buffer[i]=='=') {
+                Computer.printf("Datos leidos\n");
+                for(int i=0; i<21; i++) {
+                    Track2[i]=CardReader_Buffer[i+4];
+                }
+                Computer.printf("<%s>",Track2);
+                return 1;
+            }
+        }
+    }
+    return 0;
+}
+
+int RetiroTarjeta(uint32_t TiempoFuera)
+{
+    Computer.printf("Retiro tarjeta\n");
+    Inicio=BaseClock.read_ms();
+    while(true) {
+        if(PositionCard()==0) {
+            return 1;
+        } else {
+            Screen.Limits();                 // Se pide al usuario por pantalla el retiro de la tarjeta
+            Screen.PutString(15,12,"Retire tarjeta");
+            Screen.Show();
+        }
+        Fin=BaseClock.read_ms();
+        Transcurrido=Fin-Inicio;
+        if(Transcurrido>TiempoFuera) {
+            StateReader[1]='T';
+            return 0;
+        }
+    }
+}
+
+uint8_t IngresoTarjeta(uint32_t TimeOut)
+{
+    Computer.printf("Funcion ingreso de tarjeta\n");
+
+    Inicio=BaseClock.read_ms();
+    Keypad_Init();
+    while(true) {
+        if(PositionCard()) {
+            Computer.printf("Tarjeta ingresada\n");
+            StateReader[1]='A';
+            StateReader[2]='A';
+            StateReader[3]='A';
+            return 1;
+        }
+        Fin=BaseClock.read_ms();
+        Transcurrido=Fin-Inicio;
+        if(Transcurrido>TimeOut) {
+            Computer.printf("Tiempo limite\n");
+            StateReader[1]='T';
+            StateReader[2]='N';
+            StateReader[3]='N';
+            return 0;
+        }
+        Tecla=KeyPad_Read();
+        if(Tecla=='C') {
+            Computer.printf("Operacion cancelada\n");
+            StateReader[1]='T';
+            StateReader[2]='N';
+            StateReader[3]='N';
+            return 2;
+        }
+    }
+}
+
+uint8_t GetCard(char Salida,uint32_t TimeOutEntrada,uint32_t TimeOutSalida)
+{
+    //CardReaderStatus=[Reset,ArmDebug,DetectionOn,DetectionOff,Position,Arm,Read]
+    // C-> Command error
+    // A-> Accepted
+    // N-> Invalid
+    // E-> Error
+    // N-> No detection
+    // S-> Without answer
+    // T-> Time out
+
+    Screen.Limits();                     // Se pide al usuario por pantalla la intrduccion de la tarjeta
+    Screen.PutString(15,12,"Introduzca tarjeta");
+    Screen.PutString(15,34,"debito o credito");
+    Screen.PutChar(26,33,'!');
+    Screen.PutChar(110,33,'!');
+    Screen.Show();
+
+    if(ResetCard()) {
+        while(true) {
+
+            uint8_t RespuestaIngresoTarjeta = IngresoTarjeta(TimeOutEntrada);
+            if(RespuestaIngresoTarjeta==1) {
+                Screen.Limits();
+                Screen.PutString(15,12,"Retire tarjeta");
+                Screen.Show();
+            }
+            if(RespuestaIngresoTarjeta==0) {
+                Screen.PutString(15,12,"Sin deteccion");
+                Screen.PutChar(111,11,'!');
+                Screen.Limits();
+                Screen.Show();
+                wait(3);
+                Screen.Clean();
+                return USER_FINISH;
+            }
+            if(RespuestaIngresoTarjeta==2) {
+                Screen.Clean();
+                return USER_FINISH;
+            }
+
+            uint8_t RespuestaReadCard=ReadCard(TimeOutSalida);
+            if(RespuestaReadCard==2) {
+                Screen.Clean();
+                return USER_FINISH;
+            }
+
+
+            // Se le la tarjeta al retirarse
+            int DataResult=RecibeDataCard();    // Se corrobora que la informacion de la tajeta es la corre
+            if(DataResult==0) {
+                Screen.PutString(15,12,"Banda magnetica");
+                Screen.PutChar(125,11,'!');
+                Screen.PutString(15,34,"ilegible");
+                Screen.Limits();
+                Screen.Show();
+                wait(2);
+                if(RetiroTarjeta(7000)) {
+                    Screen.Limits();
+                    Screen.PutString(15,12,"Introduzca tarjeta");
+                    Screen.PutString(15,34,"debito o credito");
+                    Screen.PutChar(26,33,'!');
+                    Screen.PutChar(110,33,'!');
+                    Screen.Show();
+                } else {
+                    Screen.Clean();
+                    return USER_FINISH;
+                }
+            }
+            if(DataResult==1) {
+                return Salida;
+            }
+            if(DataResult==2) {
+                Screen.PutString(15,12,"Banda magnetica");
+                Screen.PutChar(125,11,'!');
+                Screen.PutString(15,34,"ilegible");
+                Screen.Limits();
+                Screen.Show();
+                wait(2);
+                if(RetiroTarjeta(7000)) {
+                    Screen.Limits();
+                    Screen.PutString(15,12,"Introduzca tarjeta");
+                    Screen.PutString(15,34,"debito o credito");
+                    Screen.PutChar(26,33,'!');
+                    Screen.PutChar(110,33,'!');
+                    Screen.Show();
+                } else {
+                    Screen.Clean();
+                    return USER_FINISH;
+                }
+            }
+        }
+    } else {
+        Screen.Limits();
+        Screen.PutString(15,20,"Error");
+        Screen.Show();
+        wait(3);
+        Screen.Clean();
+        return USER_FINISH;
+    }
+}
+
+uint8_t Continuar(uint8_t Salida,uint32_t TimeOut)
+{
+    Inicio=BaseClock.read_ms();
+    while(true) {
+        if(Slave.Answer()) {
+            Computer.printf("Continuar\n");
+            return Salida;
+        }
+        Fin=BaseClock.read_ms();
+        Transcurrido=Fin-Inicio;
+        if(Transcurrido>TimeOut) {
+            Computer.printf("Continuar tiempo\n");
+            Screen.PutString(15,12,"Operacion");
+            Screen.PutChar(84,11,'!');
+            Screen.PutString(15,34,"no disponible");
+            Screen.Limits();
+            Screen.Show();
+            wait(4);
+            return USER_FINISH;
+        }
+
+    }
+}
+uint8_t Respuesta1(uint8_t Salida,uint32_t TimeOut)
+{
+    Screen.PutString(15,12,"Realizando");
+    Screen.PutString(15,34,"Operacion...");
+    Screen.PutChar(84,33,'!');
+    Screen.Limits();
+    Screen.Show();
+    wait_ms(TimeOut);
+    return Salida;
+}
+uint8_t Respuesta2(uint8_t Salida,uint32_t TimeOut)
+{
+    Inicio=BaseClock.read_ms();
+    while(true) {
+        if(Slave.Mensaje()) {
+            Computer.printf("Available\n");
+            wait_ms(100);
+            break;
+        }
+        Fin=BaseClock.read_ms();
+        Transcurrido=Fin-Inicio;
+        if(Transcurrido>TimeOut) {
+            break;
+        }
+    }
+    InByte=Slave.Recibe();
+    Computer.printf("%c",InByte);
+    if(InByte=='A') {
+        Screen.PutString(15,12,"Operacion");
+        Screen.PutChar(84,11,'!');
+        Screen.PutString(15,34,"Aceptada");
+        Screen.Limits();
+        Screen.Show();
+        wait_ms(1000);
+        FechaRespuesta[9]=Slave.Recibe();
+        FechaRespuesta[9]=Slave.Recibe();
+        FechaRespuesta[8]=Slave.Recibe();
+        FechaRespuesta[7]=Slave.Recibe();
+        FechaRespuesta[6]=Slave.Recibe();
+        FechaRespuesta[5]=Slave.Recibe();
+        FechaRespuesta[4]=Slave.Recibe();
+        FechaRespuesta[3]=Slave.Recibe();
+        FechaRespuesta[2]=Slave.Recibe();
+        FechaRespuesta[1]=Slave.Recibe();
+        FechaRespuesta[0]=Slave.Recibe();
+        HoraRespuesta[4]=Slave.Recibe();
+        HoraRespuesta[4]=Slave.Recibe();
+        HoraRespuesta[3]=Slave.Recibe();
+        HoraRespuesta[2]=Slave.Recibe();
+        HoraRespuesta[1]=Slave.Recibe();
+        HoraRespuesta[0]=Slave.Recibe();
+        NumeroRespuesta[5]=Slave.Recibe();
+        NumeroRespuesta[5]=Slave.Recibe();
+        NumeroRespuesta[4]=Slave.Recibe();
+        NumeroRespuesta[3]=Slave.Recibe();
+        NumeroRespuesta[2]=Slave.Recibe();
+        NumeroRespuesta[1]=Slave.Recibe();
+        NumeroRespuesta[0]=Slave.Recibe();
+        Inicio=BaseClock.read_ms();
+        while(true) {
+            InByte=Slave.Recibe();
+            if(InByte==NO_DATA) {
+                break;
+            }
+            Fin=BaseClock.read_ms();
+            Transcurrido=Fin-Inicio;
+            if(Transcurrido>100) {
+                break;
+            }
+        }
+        Computer.printf("<%s> <%s> <%s>\n",FechaRespuesta,HoraRespuesta,NumeroRespuesta);
+        return Salida;
+    } else {
+        Screen.PutString(15,12,"Operacion");
+        Screen.PutString(15,34,"Rechazada");
+        Screen.PutChar(84,11,'!');
+        Screen.Limits();
+        Screen.Show();
+        wait_ms(3000);
+        return USER_FINISH;
+    }
+}
+
+void CalculoHoraFinal()
+{
+
+    int MinutoEstacionamiento=TiempoMinutos%60;
+    int HoraEstacionamiento=TiempoMinutos/60;
+
+    int HoraServicio=((uint8_t)HoraRespuesta[0]-48)*10+((uint8_t)HoraRespuesta[1]-48);
+    int MinutoServicio=((uint8_t)HoraRespuesta[3]-48)*10+((uint8_t)HoraRespuesta[4]-48);
+
+    if(HoraServicio<8){
+        HoraServicio=8;
+        MinutoServicio=0;
+    }
+    
+    int MinutosTotal = MinutoServicio + MinutoEstacionamiento;
+    int HorasTotal = HoraServicio + HoraEstacionamiento;
+
+    while(MinutosTotal >= 60) {
+        MinutosTotal = MinutosTotal - 60;
+        HorasTotal = HorasTotal + 1;
+    }
+    if(HorasTotal>=24) {
+        HorasTotal=HorasTotal-24;
+    }
+
+    if(MinutosTotal<10) {                             // Calcular tiempo en horas y minutos
+        sprintf(HoraFinal,"%i:0%i",HorasTotal,MinutosTotal);
+    } else {
+        sprintf(HoraFinal,"%i:%i",HorasTotal,MinutosTotal);
+    }
+
+}
+
+uint8_t Imprimir(uint8_t Salida)
+{
+    int PrinterState;
+    PrinterState = Impresora.Power(1);
+    Screen.PutString(15,12,"Imprimiendo");
+    Screen.PutString(15,34,"Tiquete");
+    Screen.Limits();
+    Screen.Show();
+
+    CalculoHoraFinal();
+    if(PrinterState){
+        PrinterState=Impresora.Reset();
+    }
+
+    if(PrinterState==0) {
+        Screen.Limits();
+        Screen.PutString(15,12,"Operacion aceptada");
+        Screen.PutChar(84,11,'!');
+        Screen.PutString(15,34,"Tiquete no disponible");
+        Screen.Limits();
+        Screen.Show();
+        wait(2);
+        Computer.printf("Error.\n");
+        Impresora.End();
+        AlarmasCall(2,1);
+        wait(4);
+    }
+    if(PrinterState==2) {
+        Screen.Limits();
+        Screen.PutString(15,12,"Operacion aceptada");
+        Screen.PutChar(84,11,'!');
+        Screen.PutString(15,34,"Tiquete no disponible");
+        Screen.Limits();
+        Screen.Show();
+        wait(2);
+        Computer.printf("Error.\n");
+        Impresora.End();
+        AlarmasCall(2,1);
+        wait(4);
+    }
+    if(PrinterState==1) {
+        
+        PrinterState=Impresora.Output(FechaRespuesta,HoraRespuesta,HoraFinal,Espacio,Tiempo,NumeroRespuesta,Importe);
+        if(PrinterState==0) {
+            Computer.printf("Alarma Output\n");
+            AlarmasCall(2,1);
+        } else {
+            AlarmasCall(2,0);
+        }
+
+        PrinterState=Impresora.Paper(450);
+        if(PrinterState==0) {
+            Computer.printf("Alarma Papel\n");
+            AlarmasCall(2,1);
+        } else {
+            AlarmasCall(2,0);
+        }
+
+        PrinterState=Impresora.Cutter(1);
+        if(PrinterState==0) {
+            Computer.printf("Alarma Cutter\n");
+            AlarmasCall(2,1);
+        } else {
+            AlarmasCall(2,0);
+        }
+
+        Screen.PutString(15,12,"Retire");
+        Screen.PutString(15,34,"Tiquete");
+        Screen.Limits();
+        Screen.Show();
+        wait(1);
+        
+        PrinterState=Impresora.End();
+        if(PrinterState==0) {
+            Computer.printf("Alarma Cutter\n");
+            AlarmasCall(2,1);
+        } else {
+            AlarmasCall(2,0);
+        } 
+        wait(1);       
+    }
+
+    PrinterState=Impresora.Power(0);
+    int TiquetesDisponibles=Papel-Impresora.Ticket(1);
+    if(TiquetesDisponibles<200) {
+        sprintf(PapelDisponible,"%i",TiquetesDisponibles);
+        AlarmasCall(3,1);
+    } else {
+        sprintf(PapelDisponible,"%i",TiquetesDisponibles);
+        AlarmasCall(3,0);
+    }
+    return Salida;
+}
+
+
+void Usuario_OperacionConsecutiva()
+{
+    uint8_t Comando=USER_INIT;
+    if(Comando==USER_INIT) {
+        Computer.printf("Usuario operacion consecutiva\n");
+        Screen.On(HoraHostingPantalla);
+        wait_ms(20);
+        Screen.Init();
+        Screen.Clean();
+        BaseClock.reset();
+        Comando=USER_PLACE;
+    }
+
+    if(Comando==USER_PLACE) {
+        Computer.printf("Usuario espacio\n");
+        CardReaderPower=1;
+        Comando=GetPlace(USER_CARD,15000);
+        if(Comando==USER_CARD) {
+            Slave.Command(COMMAND_INIT);
+        }
+    }
+
+    if(Comando==USER_CARD) {
+        Computer.printf("Usuario tarjeta\n");
+        Comando=GetCard(USER_TIME,20000,5000);
+        if(Comando==USER_TIME) {
+            Slave.Command(COMMAND_GPRS);
+        }
+    }
+
+    if(Comando==USER_TIME) {
+        Computer.printf("Usuario tiempo\n");
+        CardReaderPower=0;
+        Comando=GetTime(USER_DATA,15000);
+        if (Comando==USER_FINISH){
+            Slave.Command(COMMAND_END);
+        }
+        Comando=Continuar(Comando,7000);
+    }
+
+    if(Comando==USER_DATA) {
+        Computer.printf("Usuario datos\n");
+        Slave.Command(COMMAND_DATA);
+        Slave.Send_User(Parquimetro,Municipio,TiempoMinutos,Espacio,Track2);
+        Comando=Continuar(USER_POST,20000);
+    }
+
+    if(Comando==USER_POST) {
+        Computer.printf("Usuario operacion\n");
+        Slave.Command(COMMAND_POST);
+        Comando=Respuesta1(USER_ANSWER,3000);
+    }
+
+    if(Comando==USER_ANSWER) {
+        Computer.printf("Usuario respuesta\n");
+        Slave.Command(COMMAND_ANSWER);
+        Comando=Respuesta2(USER_PRINT,50000);
+    }
+
+    if(Comando==USER_PRINT) {
+        Computer.printf("Usuario imprimiendo\n");
+        Comando=Imprimir(USER_FINISH);
+    }
+
+    if(Comando==USER_FINISH) {
+        Computer.printf("Usuario finalizar\n");
+        Comando=Impresora.End();
+        Screen.Clean();
+        CardReaderPower=0;
+        Impresora.Power(0);
+        Screen.Off();
+    }
+}
+
+void Usuario(uint8_t Entrada)
+{
+    uint8_t Comando=Entrada;
+    if(Comando==USER_INIT) {
+        Computer.printf("Usuario iniciar\n");
+        Screen.On(HoraHostingPantalla);
+        wait_ms(20);
+        Screen.Init();
+        Slave.Awake();
+        Slave.Command(COMMAND_ON);
+        //PantallaInicio();
+        BaseClock.start();
+        BaseClock.reset();
+        Comando=USER_PLACE;
+    }
+
+    if(Comando==USER_INIT2) {
+        Computer.printf("Usuario iniciar\n");
+        BaseClock.start();
+        BaseClock.reset();
+        Comando=USER_PLACE;
+    }
+    
+    if(Comando==USER_INIT3) {
+        Computer.printf("Usuario iniciar\n");
+        BaseClock.start();
+        BaseClock.reset();
+        Computer.printf("Usuario espacio\n");
+        CardReaderPower=1;
+        Comando=GetPlace(USER_CARD,15000);
+    }
+    
+    if(Comando==USER_INIT4) {
+        Computer.printf("Usuario iniciar\n");
+        BaseClock.start();
+        BaseClock.reset();
+        Computer.printf("Usuario espacio\n");
+        CardReaderPower=1;
+        Comando=GetPlace(USER_CARD2,15000);
+    }
+    
+    
+    if(Comando==USER_INIT5) {
+        Computer.printf("Usuario iniciar\n");
+        BaseClock.start();
+        BaseClock.reset();
+        Computer.printf("Usuario espacio\n");
+        CardReaderPower=1;
+        Comando=GetPlace(USER_CARD2,15000);
+        if(Comando==USER_CARD2) {
+            Slave.Command(HOSTING_OFF);
+        }
+    }
+
+    if(Comando==USER_PLACE) {
+        Computer.printf("Usuario espacio\n");
+        CardReaderPower=1;
+        Comando=GetPlace(USER_CARD,15000);        
+        if(Comando==USER_CARD) {
+            Slave.Command(COMMAND_INIT);
+        }
+    }
+    
+    if(Comando==USER_CARD2) {
+        Computer.printf("Usuario tarjetA 2\n");
+        Comando=GetCard(USER_TIME,20000,5000);
+    }
+
+    if(Comando==USER_CARD) {
+        Computer.printf("Usuario tarjeta\n");
+        Comando=GetCard(USER_TIME,20000,5000);
+        if(Comando==USER_TIME) {
+            Slave.Command(COMMAND_GPRS);
+        }
+    }
+
+    if(Comando==USER_TIME) {
+        Computer.printf("Usuario tiempo\n");
+        CardReaderPower=0;
+        Comando=GetTime(USER_DATA,15000);
+        if (Comando==USER_FINISH){
+            Slave.Command(COMMAND_END);
+        }
+        Comando=Continuar(Comando,7000);
+    }
+
+    if(Comando==USER_DATA) {
+        Computer.printf("Usuario datos\n");
+        Slave.Command(COMMAND_DATA);
+        Slave.Send_User(Parquimetro,Municipio,TiempoMinutos,Espacio,Track2);
+        Computer.printf("Tiempo: -%i-\n",TiempoMinutos);
+        Computer.printf("Parquimetro: -%s-\n",Parquimetro);
+        Computer.printf("Municipio: -%s-\n",Municipio);
+        Computer.printf("Espacio: -%s-\n",Espacio);
+        Computer.printf("Tiempo: -%s-\n",Track2);
+        Computer.printf("-%s-%s-%i-%s-%s-",Parquimetro,Municipio,TiempoMinutos,Espacio,Track2);
+        Comando=Continuar(USER_POST,20000);
+        if (Comando==USER_FINISH){
+            Slave.Command(COMMAND_END);
+        }
+        
+    }
+
+    if(Comando==USER_POST) {
+        Computer.printf("Usuario operacion\n");
+        Slave.Command(COMMAND_POST);
+        Comando=Respuesta1(USER_ANSWER,3000);
+    }
+
+    if(Comando==USER_ANSWER) {
+        Computer.printf("Usuario respuesta\n");
+        Slave.Command(COMMAND_ANSWER);
+        Comando=Respuesta2(USER_PRINT,50000);
+    }
+
+    if(Comando==USER_PRINT) {
+        Computer.printf("Usuario imprimiendo\n");
+        Comando=Imprimir(USER_FINISH);
+    }
+
+    if(Comando==USER_FINISH) {
+        Computer.printf("Usuario finalizar\n");
+        Comando=Impresora.End();
+        Screen.Clean();
+        CardReaderPower=0;
+        Impresora.Power(0);
+        Screen.Off();
+        Inicio=BaseClock.read_ms();
+        Keypad_Init();
+        while(true) {
+            Fin=BaseClock.read_ms();
+            Transcurrido=Fin-Inicio;
+            if(Transcurrido>10000) {
+                break;
+            }
+            Tecla=KeyPad_Read();
+            if (Tecla!=NO_KEY) {
+                Usuario_OperacionConsecutiva();
+                Inicio=BaseClock.read_ms();
+            }
+        }
+        Slave.Command(COMMAND_OFF);
+    }
+}
+
+//-----------------------------------------------------------------------------------------------------------------------------------------------------
+
+void Interrupt_Mantenimiento()
+{
+    MantenimientoInterruption=1;
+}
+
+void M_PantallaConfiguracion()
+{
+    Computer.printf("Pantala modo configuracion\n");
+
+    Screen.Limits();
+    Screen.PutString(35,19,"Modo Configuracion");
+    Screen.Show();
+    wait_ms(1000);
+}
+
+uint8_t M_MenuConfiguracion(uint32_t Delay)
+{
+
+    int Selection=1;
+    uint8_t Salida=M_SISTEMA;
+    int SelectionBox[2]= {4,7};
+    bool Arriba;
+    bool Abajo;
+    bool Finalizar;
+    bool Salir;
+    Inicio=BaseClock.read_ms();
+
+    Screen.Limits();
+    Screen.Rectangle(SelectionBox[0],SelectionBox[1],8,8);
+    Screen.PutString(15,4,"Sistema");
+    Screen.PutString(15,23,"Red");
+    Screen.PutString(15,42,"Impresora");
+    Screen.PutString(135,4,"Teclado");
+    Screen.PutString(135,23,"Lectora");
+    Screen.PutString(135,42,"Informacion");
+    Screen.Show();
+
+    Computer.printf("Sistema\n");
+
+    while(true) {
+        Fin=BaseClock.read_ms();
+        Transcurrido=Fin-Inicio;
+        if(Transcurrido>Delay) {
+            return M_OFF;
+        }
+        Tecla = KeyPad_Read();
+        if (Tecla!=NO_KEY) {                // Se valida que se ingrese algo en el teclado
+            Inicio=BaseClock.read_ms();
+
+            Arriba=(Tecla=='F');
+            if (Arriba) {                     //Subir puntero
+                Selection++;
+                if(Selection==7) {
+                    Selection=1;
+                }
+            }
+            Abajo=(Tecla=='E');
+            if (Abajo) {                      //Bajar puntero
+                Selection--;
+                if(Selection==0) {
+                    Selection=6;
+                }
+            }
+            Salir=(Tecla=='C');              //Cancelar Operacion
+            if (Salir) {
+                return M_OFF;
+            }
+            Finalizar=(Tecla=='D');          //En caso de confirmacion
+            if (Finalizar) {
+                return Salida;
+            }
+            switch (Selection) {
+                case 1:
+                    SelectionBox[0]=4;
+                    SelectionBox[1]=7;
+                    Computer.printf("Sistema\n");
+                    Salida=M_SISTEMA;
+                    break;
+                case 2:
+                    SelectionBox[0]=4;
+                    SelectionBox[1]=26;
+                    Computer.printf("Red\n");
+                    Salida=M_RED;
+                    break;
+                case 3:
+                    SelectionBox[0]=4;
+                    SelectionBox[1]=45;
+                    Computer.printf("Impresora\n");
+                    Salida=M_IMPRESORA;
+                    break;
+                case 4:
+                    SelectionBox[0]=124;
+                    SelectionBox[1]=7;
+                    Computer.printf("Teclado\n");
+                    Salida=M_TECLADO;
+                    break;
+                case 5:
+                    SelectionBox[0]=124;
+                    SelectionBox[1]=26;
+                    Computer.printf("Lectora\n");
+                    Salida=M_LECTORA;
+                    break;
+                case 6:
+                    SelectionBox[0]=124;
+                    SelectionBox[1]=45;
+                    Computer.printf("Informacion\n");
+                    Salida=M_INFORMACION;
+                    break;
+            }
+
+            Screen.Limits();
+            Screen.Rectangle(SelectionBox[0],SelectionBox[1],8,8);
+            Screen.PutString(15,4,"Sistema");
+            Screen.PutString(15,23,"Red");
+            Screen.PutString(15,42,"Impresora");
+            Screen.PutString(135,4,"Teclado");
+            Screen.PutString(135,23,"Lectora");
+            Screen.PutString(135,42,"Informacion");
+            Screen.Show();
+        }
+    }
+}
+
+uint8_t M_MenuSistema(uint32_t Delay)
+{
+
+    uint8_t Salida=M_PARQUIMETRO;
+    int Selection=1;
+    int SelectionBox[2]= {4,7};
+    bool Arriba;
+    bool Abajo;
+    bool Finalizar;
+    bool Salir;
+    bool Atras;
+    Inicio=BaseClock.read_ms();
+
+    Screen.Limits();
+    Screen.Rectangle(SelectionBox[0],SelectionBox[1],8,8);
+    Screen.PutString(15,4,"Id Parquimetro");
+    Screen.PutString(15,23,"Id Municipalidad");
+    Screen.PutString(15,42,"Precio 10 mins");
+    Screen.Show();
+    Computer.printf("Id parquimetro\n");
+
+    while(true) {
+        Fin=BaseClock.read_ms();
+        Transcurrido=Fin-Inicio;
+        if(Transcurrido>Delay) {
+            return M_OFF;
+        }
+        Tecla = KeyPad_Read();
+        if (Tecla!=NO_KEY) {                  // Se valida que se ingrese algo en el teclado
+            Inicio=BaseClock.read_ms();
+
+            Arriba=(Tecla=='F');
+            if (Arriba) {                       //Subir puntero
+                Selection++;
+                if(Selection==4) {
+                    Selection=1;
+                }
+            }
+            Abajo=(Tecla=='E');
+            if (Abajo) {                        //Bajar puntero
+                Selection--;
+                if(Selection==0) {
+                    Selection=3;
+                }
+            }
+            Salir=(Tecla=='C');              //Cancelar Operacion
+            if (Salir) {
+                return M_OFF;
+            }
+            Atras=(Tecla=='B');
+            if (Atras) {                     //Atras en menu
+                return M_ATRAS;
+            }
+            Finalizar=(Tecla=='D');          //En caso de confirmacion
+            if (Finalizar) {
+                return Salida;
+            }
+            switch (Selection) {
+                case 1:
+                    SelectionBox[0]=4;
+                    SelectionBox[1]=7;
+                    Computer.printf("Id Parquimetro\n");
+                    Salida=M_PARQUIMETRO;
+                    break;
+                case 2:
+                    SelectionBox[0]=4;
+                    SelectionBox[1]=26;
+                    Computer.printf("Id Municipalidad\n");
+                    Salida=M_MUNICIPIO;
+                    break;
+                case 3:
+                    SelectionBox[0]=4;
+                    SelectionBox[1]=45;
+                    Computer.printf("Precio 10mins\n");
+                    Salida=M_PRECIO;
+                    break;
+            }
+            Screen.Limits();
+            Screen.Rectangle(SelectionBox[0],SelectionBox[1],8,8);
+            Screen.PutString(15,4,"Id Parquimetro");
+            Screen.PutString(15,23,"Id Municipalidad");
+            Screen.PutString(15,42,"Precio 10 mins");
+            Screen.Show();
+        }
+    }
+}
+
+uint8_t M_MenuConexion(uint32_t Delay)
+{
+    uint8_t Salida=M_SENAL;
+    int Selection=1;
+    int SelectionBox[2]= {4,7};
+    bool Arriba;
+    bool Abajo;
+    bool Finalizar;
+    bool Salir;
+    bool Atras;
+    Inicio=BaseClock.read_ms();
+
+    Screen.Limits();
+    Screen.Rectangle(SelectionBox[0],SelectionBox[1],8,8);
+    Screen.Rectangle(129,6,5,0);
+    Screen.PutString(15,4,"Intensidad senal");
+    Screen.PutString(15,23,"Prueba hosting");
+    Screen.PutString(15,42,"Conexion red");
+    Screen.Show();
+
+    Computer.printf("Intensidad senal\n");
+
+    while(true) {
+        Fin=BaseClock.read_ms();
+        Transcurrido=Fin-Inicio;
+        if(Transcurrido>Delay) {
+            return M_OFF;
+        }
+        Tecla = KeyPad_Read();
+        if (Tecla!=NO_KEY) {                  // Se valida que se ingrese algo en el teclado
+            Inicio=BaseClock.read_ms();
+
+            Arriba=(Tecla=='F');
+            if (Arriba) {                    //Subir puntero
+                Selection++;
+                if(Selection==4) {
+                    Selection=1;
+                }
+            }
+            Abajo=(Tecla=='E');
+            if (Abajo) {                     //Bajar puntero
+                Selection--;
+                if(Selection==0) {
+                    Selection=3;
+                }
+            }
+            Atras=(Tecla=='B');
+            if (Atras) {                     //Atras en menu
+                return M_ATRAS;
+            }
+            Salir=(Tecla=='C');              //Cancelar Operacion
+            if (Salir) {
+                return M_OFF;
+            }
+            Finalizar=(Tecla=='D');          //En caso de confirmacion
+            if (Finalizar) {
+                return Salida;
+            }
+            switch (Selection) {
+                case 1:
+                    SelectionBox[0]=4;
+                    SelectionBox[1]=7;
+                    Computer.printf("Intensidad senal\n");
+                    Salida=M_SENAL;
+                    break;
+                case 2:
+                    SelectionBox[0]=4;
+                    SelectionBox[1]=26;
+                    Computer.printf("Prueba hosting\n");
+                    Salida=M_HOSTING;
+                    break;
+                case 3:
+                    SelectionBox[0]=4;
+                    SelectionBox[1]=45;
+                    Computer.printf("Conexion red\n");
+                    Salida=M_CONEXION_SIM ;
+                    break;
+            }
+            Screen.Limits();
+            Screen.Rectangle(SelectionBox[0],SelectionBox[1],8,8);
+            Screen.Rectangle(129,6,5,0);
+            Screen.PutString(15,4,"Intensidad senal");
+            Screen.PutString(15,23,"Prueba hosting");
+            Screen.PutString(15,42,"Conexion red");
+            Screen.Show();
+        }
+    }
+}
+
+uint8_t M_MenuImpresora(uint32_t Delay)
+{
+    uint8_t Salida=M_PAPEL;
+    int Selection=1;
+    int SelectionBox[2]= {4,7};
+    bool Arriba;
+    bool Abajo;
+    bool Finalizar;
+    bool Salir;
+    bool Atras;
+    Inicio=BaseClock.read_ms();
+
+    Screen.Limits();
+    Screen.Rectangle(SelectionBox[0],SelectionBox[1],8,8);
+    Screen.PutString(15,4,"Cambio de papel");
+    Screen.PutString(15,23,"Tiquete de prueba");
+    Screen.PutString(15,42,"Conexion impresora");
+    Screen.Show();
+
+    Computer.printf("Cambio de papel\n");
+
+    while(true) {
+        Fin=BaseClock.read_ms();
+        Transcurrido=Fin-Inicio;
+        if(Transcurrido>Delay) {
+            return M_OFF;
+        }
+        Tecla = KeyPad_Read();
+        if (Tecla!=NO_KEY) {                  // Se valida que se ingrese algo en el teclado
+            Inicio=BaseClock.read_ms();
+
+            Arriba=(Tecla=='F');
+            if (Arriba) {                    //Subir puntero
+                Selection++;
+                if(Selection==4) {
+                    Selection=1;
+                }
+            }
+            Abajo=(Tecla=='E');
+            if (Abajo) {                     //Bajar puntero
+                Selection--;
+                if(Selection==0) {
+                    Selection=3;
+                }
+            }
+            Salir=(Tecla=='C');              //Cancelar Operacion
+            if (Salir) {
+                return M_OFF;
+            }
+            Atras=(Tecla=='B');
+            if (Atras) {                     //Atras en menu
+                return M_ATRAS;
+            }
+            Finalizar=(Tecla=='D');          //En caso de confirmacion
+            if (Finalizar) {
+                return Salida;
+            }
+            switch (Selection) {
+                case 1:
+                    SelectionBox[0]=4;
+                    SelectionBox[1]=7;
+                    Computer.printf("Cambio de papel\n");
+                    Salida=M_PAPEL;
+                    break;
+                case 2:
+                    SelectionBox[0]=4;
+                    SelectionBox[1]=26;
+                    Computer.printf("Tiquete de prueba\n");
+                    Salida=M_IMPRESION;
+                    break;
+                case 3:
+                    SelectionBox[0]=4;
+                    SelectionBox[1]=45;
+                    Computer.printf("Conexion impresora\n");
+                    Salida=M_CONEXION_IMP;
+                    break;
+            }
+            Screen.Limits();
+            Screen.Rectangle(SelectionBox[0],SelectionBox[1],8,8);
+            Screen.PutString(15,4,"Cambio de papel");
+            Screen.PutString(15,23,"Tiquete de prueba");
+            Screen.PutString(15,42,"Conexion impresora");
+            Screen.Show();
+        }
+    }
+}
+
+uint8_t M_MenuLectora(uint32_t Delay)
+{
+    uint8_t Salida=M_LECTURA;
+    int Selection=1;
+    int SelectionBox[2]= {4,7};
+    bool Arriba;
+    bool Abajo;
+    bool Finalizar;
+    bool Salir;
+    bool Atras;
+    Inicio=BaseClock.read_ms();
+
+    Screen.Limits();
+    Screen.Rectangle(SelectionBox[0],SelectionBox[1],8,8);
+    Screen.PutString(15,4,"Prueba de lectura");
+    Screen.PutString(15,23,"Conexion lectora");
+    Screen.Show();
+
+    Computer.printf("Prueba de lectura\n");
+
+    while(true) {
+        Fin=BaseClock.read_ms();
+        Transcurrido=Fin-Inicio;
+        if(Transcurrido>Delay) {
+            return M_OFF;
+        }
+        Tecla = KeyPad_Read();
+        if (Tecla!=NO_KEY) {                  // Se valida que se ingrese algo en el teclado
+            Inicio=BaseClock.read_ms();
+
+            Arriba=(Tecla=='F');
+            if (Arriba) {                    //Subir puntero
+                Selection++;
+                if(Selection==3) {
+                    Selection=1;
+                }
+            }
+            Abajo=(Tecla=='E');
+            if (Abajo) {                     //Bajar puntero
+                Selection--;
+                if(Selection==0) {
+                    Selection=2;
+                }
+            }
+            Salir=(Tecla=='C');              //Cancelar Operacion
+            if (Salir) {
+                return M_OFF;
+            }
+            Atras=(Tecla=='B');
+            if (Atras) {                     //Atras en menu
+                return M_ATRAS;
+            }
+            Finalizar=(Tecla=='D');          //En caso de confirmacion
+            if (Finalizar) {
+                return Salida;
+            }
+            switch (Selection) {
+                case 1:
+                    SelectionBox[0]=4;
+                    SelectionBox[1]=7;
+                    Computer.printf("Prueba de lectura\n");
+                    Salida=M_LECTURA;
+                    break;
+                case 2:
+                    SelectionBox[0]=4;
+                    SelectionBox[1]=26;
+                    Computer.printf("Conexion lectora\n");
+                    Salida=M_CONEXION_LEC;
+                    break;
+            }
+
+            Screen.Limits();
+            Screen.Rectangle(SelectionBox[0],SelectionBox[1],8,8);
+            Screen.PutString(15,4,"Prueba de lectura");
+            Screen.PutString(15,23,"Conexion lectora");
+            Screen.Show();
+        }
+    }
+}
+
+uint8_t M_MenuTeclado(long Delay)
+{
+    uint8_t Salida=M_PRUEBA_TECLA;
+    int Selection=1;
+    int SelectionBox[2]= {4,7};
+    bool Arriba;
+    bool Abajo;
+    bool Finalizar;
+    bool Salir;
+    bool Atras;
+    Inicio=BaseClock.read_ms();
+
+    Screen.Limits();
+    Screen.Rectangle(SelectionBox[0],SelectionBox[1],8,8);
+    Screen.PutString(15,4,"Prueba de teclado");
+    Screen.Show();
+    Computer.printf("Prueba de teclado\n");
+
+    while(true) {
+        Fin=BaseClock.read_ms();
+        Transcurrido=Fin-Inicio;
+        if(Transcurrido>Delay) {
+            return M_OFF;
+        }
+        Tecla = KeyPad_Read();
+        if (Tecla!=NO_KEY) {                  // Se valida que se ingrese algo en el teclado
+            Inicio=BaseClock.read_ms();
+
+            Arriba=(Tecla=='F');
+            if (Arriba) {                    //Subir puntero
+                Selection++;
+                if(Selection==2) {
+                    Selection=1;
+                }
+            }
+            Abajo=(Tecla=='E');
+            if (Abajo) {                     //Bajar puntero
+                Selection--;
+                if(Selection==0) {
+                    Selection=1;
+                }
+            }
+            Salir=(Tecla=='C');              //Cancelar Operacion
+            if (Salir) {
+                return M_OFF;
+            }
+            Atras=(Tecla=='B');
+            if (Atras) {                     //Atras en menu
+                return M_ATRAS;
+            }
+            Finalizar=(Tecla=='D');          //En caso de confirmacion
+            if (Finalizar) {
+                return Salida;
+            }
+            switch (Selection) {
+                case 1:
+                    SelectionBox[0]=4;
+                    SelectionBox[1]=7;
+                    Computer.printf("Prueba de teclado\n");
+                    Salida=M_PRUEBA_TECLA;
+                    break;
+            }
+            Screen.Limits();
+            Screen.Rectangle(SelectionBox[0],SelectionBox[1],8,8);
+            Screen.PutString(15,4,"Prueba de teclado");
+            Screen.Show();
+        }
+    }
+}
+
+uint8_t M_MenuInformacion()
+{
+    return M_INFORMACION;
+}
+
+void M_Parquimetro(uint32_t TimeOut)
+{
+    char ID_Actual[5];   //Lectura de valor en memoria
+    sprintf(ID_Actual,"%s",Parquimetro);
+    int SelectionLine1[4]= {99,32,9,0};
+    int SelectionLine2[4]= {99,50,9,0};
+    int Line=1;
+    bool Numero;
+    bool Arriba;
+    bool Abajo;
+    bool Salir;
+    bool Atras;
+    bool Finalizar;
+
+    Inicio=BaseClock.read_ms();
+
+    Screen.Rectangle(SelectionLine1[0],SelectionLine1[1],SelectionLine1[2],SelectionLine1[3]);
+    Screen.Rectangle(SelectionLine2[0],SelectionLine2[1],SelectionLine2[2],SelectionLine2[3]);
+    Screen.PutString(15,12,"Id Parquimetro");
+    Screen.PutChar(100,34,ID_Actual[0]);
+    Screen.PutChar(110,34,ID_Actual[1]);
+    Screen.PutChar(120,34,ID_Actual[2]);
+    Screen.PutChar(130,34,ID_Actual[3]);
+    Screen.Limits();
+    Screen.Show();
+    Computer.printf("Id Parquimetro\n");
+    Computer.printf("%s\n",ID_Actual);
+
+    while(true) {
+        Fin=BaseClock.read_ms();
+        Transcurrido=Fin-Inicio;
+        if(Transcurrido>TimeOut) {
+            break;
+        }
+        Tecla=KeyPad_Read();
+        if (Tecla!=NO_KEY) {                  // Se valida que se ingrese algo en el teclado
+            Inicio=BaseClock.read_ms();
+
+            Numero=(Tecla=='0')||(Tecla=='1')||(Tecla=='2')||(Tecla=='3')||(Tecla=='4')||(Tecla=='5')||(Tecla=='6')||(Tecla=='7')||(Tecla=='8')||(Tecla=='9');
+            if (Numero) {                     //Cambiar numero
+                if((Tecla=='0')&&(Line==1)) {
+                    ID_Actual[Line-1]='1';
+                } else {
+                    ID_Actual[Line-1]=Tecla;
+                }
+                Line++;
+                if(Line==5) {
+                    Line=1;
+                }
+                if(Line==0) {
+                    Line=4;
+                }
+            }
+            Arriba=(Tecla=='E');
+            if (Arriba) {                    //Subir puntero
+                Line++;
+                if(Line==5) {
+                    Line=1;
+                }
+            }
+            Abajo=(Tecla=='F');
+            if (Abajo) {                     //Bajar puntero
+                Line--;
+                if(Line==0) {
+                    Line=4;
+                }
+            }
+            Salir=(Tecla=='C');              //Cancelar Operacion
+            if (Salir) {
+                break;
+            }
+            Atras=(Tecla=='B');
+            if (Atras) {                     //Atras en menu
+                break;
+            }
+            Finalizar=(Tecla=='D');          //En caso de confirmacion
+            if (Finalizar) {
+                sprintf(Parquimetro,"%s",ID_Actual);
+                break;
+            }
+            switch (Line) {
+                case 1:
+                    SelectionLine1[0]=99;
+                    SelectionLine2[0]=99;
+                    break;
+                case 2:
+                    SelectionLine1[0]=109;
+                    SelectionLine2[0]=109;
+                    break;
+                case 3:
+                    SelectionLine1[0]=119;
+                    SelectionLine2[0]=119;
+                    break;
+                case 4:
+                    SelectionLine1[0]=129;
+                    SelectionLine2[0]=129;
+                    break;
+            }
+            //-------Mostrar en Patalla-------
+            Screen.Rectangle(SelectionLine1[0],SelectionLine1[1],SelectionLine1[2],SelectionLine1[3]);
+            Screen.Rectangle(SelectionLine2[0],SelectionLine2[1],SelectionLine2[2],SelectionLine2[3]);
+            Screen.PutString(15,12,"Id Parquimetro");
+            Screen.PutChar(100,34,ID_Actual[0]);
+            Screen.PutChar(110,34,ID_Actual[1]);
+            Screen.PutChar(120,34,ID_Actual[2]);
+            Screen.PutChar(130,34,ID_Actual[3]);
+            Screen.Limits();
+            Screen.Show();
+            Computer.printf("%s\n",ID_Actual);
+        }
+    }
+}
+
+void M_Municipio(uint32_t TimeOut)
+{
+    char CodigoMunicipio_Actual[3];   //Lectura de valor en memoria
+    sprintf(CodigoMunicipio_Actual,"%s",CodigoMunicipio);
+
+    int SelectionLine1[4]= {109,32,9,0};
+    int SelectionLine2[4]= {109,50,9,0};
+    int Line=1;
+    bool Numero;
+    bool Arriba;
+    bool Abajo;
+    bool Salir;
+    bool Atras;
+    bool Finalizar;
+
+    Inicio=BaseClock.read_ms();
+
+    Screen.Rectangle(SelectionLine1[0],SelectionLine1[1],SelectionLine1[2],SelectionLine1[3]);
+    Screen.Rectangle(SelectionLine2[0],SelectionLine2[1],SelectionLine2[2],SelectionLine2[3]);
+    Screen.PutString(15,12,"Id Municipalidad");
+    Screen.PutChar(110,34,CodigoMunicipio_Actual[0]);
+    Screen.PutChar(120,34,CodigoMunicipio_Actual[1]);
+    Screen.Limits();
+    Screen.Show();
+    Computer.printf("Id Municipalidad\n");
+    Computer.printf("%s\n",CodigoMunicipio_Actual);
+
+    while(true) {
+        Fin=BaseClock.read_ms();
+        Transcurrido=Fin-Inicio;
+        if(Transcurrido>TimeOut) {
+            break;
+        }
+        Tecla=KeyPad_Read();
+        if (Tecla!=NO_KEY) {                  // Se valida que se ingrese algo en el teclado
+            Inicio=BaseClock.read_ms();
+
+            Numero=(Tecla=='0')||(Tecla=='1')||(Tecla=='2')||(Tecla=='3')||(Tecla=='4')||(Tecla=='5')||(Tecla=='6')||(Tecla=='7')||(Tecla=='8')||(Tecla=='9');
+            if (Numero) {                     //Cambiar numero
+                CodigoMunicipio_Actual[Line-1]=Tecla;
+                Line++;
+                if(Line==3) {
+                    Line=1;
+                }
+                if(Line==0) {
+                    Line=2;
+                }
+            }
+            Arriba=(Tecla=='E');
+            if (Arriba) {                    //Subir puntero
+                Line++;
+                if(Line==3) {
+                    Line=1;
+                }
+            }
+            Abajo=(Tecla=='F');
+            if (Abajo) {                     //Bajar puntero
+                Line--;
+                if(Line==0) {
+                    Line=2;
+                }
+            }
+            Salir=(Tecla=='C');              //Cancelar Operacion
+            if (Salir) {
+                break;
+            }
+            Atras=(Tecla=='B');
+            if (Atras) {                     //Atras en menu
+                break;
+            }
+            Finalizar=(Tecla=='D');          //En caso de confirmacion
+            if (Finalizar) {
+                sprintf(CodigoMunicipio,"%s",CodigoMunicipio_Actual);
+                if((CodigoMunicipio[0]=='0')&&(CodigoMunicipio[1]=='1')) {
+                    sprintf(Municipio,"San Jose");
+                    Computer.printf("San Jose\n");
+                }
+                if((CodigoMunicipio[0]=='0')&&(CodigoMunicipio[1]=='2')) {
+                    sprintf(Municipio,"Tibas");
+                    Computer.printf("Tibas\n");
+                }
+                break;
+            }
+            switch (Line) {
+                case 1:
+                    SelectionLine1[0]=109;
+                    SelectionLine2[0]=109;
+                    break;
+                case 2:
+                    SelectionLine1[0]=119;
+                    SelectionLine2[0]=119;
+                    break;
+            }
+            //-------Mostrar en Patalla-------
+            Screen.Rectangle(SelectionLine1[0],SelectionLine1[1],SelectionLine1[2],SelectionLine1[3]);
+            Screen.Rectangle(SelectionLine2[0],SelectionLine2[1],SelectionLine2[2],SelectionLine2[3]);
+            Screen.PutString(15,12,"Id Municipalidad");
+            Screen.PutChar(110,34,CodigoMunicipio_Actual[0]);
+            Screen.PutChar(120,34,CodigoMunicipio_Actual[1]);
+            Screen.Limits();
+            Screen.Show();
+            Computer.printf("%s\n",CodigoMunicipio_Actual);
+        }
+    }
+}
+
+void M_Precio(uint32_t TimeOut)
+{
+    char Precio_Actual[5];   //Lectura de valor en memoria
+    if(Precio>999) {
+        sprintf(Precio_Actual,"%i",Precio);
+    }
+    if(Precio<1000) {
+        sprintf(Precio_Actual,"0%i",Precio);
+    }
+    if(Precio<100) {
+        sprintf(Precio_Actual,"00%i",Precio);
+    }
+    if(Precio<10) {
+        sprintf(Precio_Actual,"000%i",Precio);
+    }
+
+    int SelectionLine1[4]= {99,32,9,0};
+    int SelectionLine2[4]= {99,50,9,0};
+    int Line=1;
+    bool Numero;
+    bool Arriba;
+    bool Abajo;
+    bool Salir;
+    bool Atras;
+    bool Finalizar;
+    Inicio=BaseClock.read_ms();
+
+    Screen.Rectangle(SelectionLine1[0],SelectionLine1[1],SelectionLine1[2],SelectionLine1[3]);
+    Screen.Rectangle(SelectionLine2[0],SelectionLine2[1],SelectionLine2[2],SelectionLine2[3]);
+    Screen.PutString(15,12,"Precio establecido");
+    Screen.PutChar(100,34,Precio_Actual[0]);
+    Screen.PutChar(110,34,Precio_Actual[1]);
+    Screen.PutChar(120,34,Precio_Actual[2]);
+    Screen.PutChar(130,34,Precio_Actual[3]);
+    Screen.PutChar(140,34,'*');
+    Screen.Limits();
+    Screen.Show();
+    Computer.printf("Precio establecido\n");
+    Computer.printf("%s\n",Precio_Actual);
+
+    while(true) {
+        Fin=BaseClock.read_ms();
+        Transcurrido=Fin-Inicio;
+        if(Transcurrido>TimeOut) {
+            break;
+        }
+        Tecla=KeyPad_Read();
+        if (Tecla!=NO_KEY) {                  // Se valida que se ingrese algo en el teclado
+            Inicio=BaseClock.read_ms();
+
+            Numero=(Tecla=='0')||(Tecla=='1')||(Tecla=='2')||(Tecla=='3')||(Tecla=='4')||(Tecla=='5')||(Tecla=='6')||(Tecla=='7')||(Tecla=='8')||(Tecla=='9');
+            if (Numero) {                     //Cambiar numero
+                Precio_Actual[Line-1]=Tecla;
+                Line++;
+                if(Line==5) {
+                    Line=1;
+                }
+                if(Line==0) {
+                    Line=4;
+                }
+            }
+            Arriba=(Tecla=='E');
+            if (Arriba) {                    //Subir puntero
+                Line++;
+                if(Line==5) {
+                    Line=1;
+                }
+            }
+            Abajo=(Tecla=='F');
+            if (Abajo) {                     //Bajar puntero
+                Line--;
+                if(Line==0) {
+                    Line=4;
+                }
+            }
+            Salir=(Tecla=='C');              //Cancelar Operacion
+            if (Salir) {
+                break;
+            }
+            Atras=(Tecla=='B');
+            if (Atras) {                     //Atras en menu
+                break;
+            }
+            Finalizar=(Tecla=='D');          //En caso de confirmacion
+            if (Finalizar) {
+                Precio=((uint8_t)Precio_Actual[0]-48)*1000+((uint8_t)Precio_Actual[1]-48)*100+((uint8_t)Precio_Actual[2]-48)*10+((uint8_t)Precio_Actual[3]-48);
+                break;
+            }
+            switch (Line) {
+                case 1:
+                    SelectionLine1[0]=99;
+                    SelectionLine2[0]=99;
+                    break;
+                case 2:
+                    SelectionLine1[0]=109;
+                    SelectionLine2[0]=109;
+                    break;
+                case 3:
+                    SelectionLine1[0]=119;
+                    SelectionLine2[0]=119;
+                    break;
+                case 4:
+                    SelectionLine1[0]=129;
+                    SelectionLine2[0]=129;
+                    break;
+            }
+            //-------Mostrar en Patalla-------
+            Screen.Rectangle(SelectionLine1[0],SelectionLine1[1],SelectionLine1[2],SelectionLine1[3]);
+            Screen.Rectangle(SelectionLine2[0],SelectionLine2[1],SelectionLine2[2],SelectionLine2[3]);
+            Screen.PutString(15,12,"Precio establecido");
+            Screen.PutChar(100,34,Precio_Actual[0]);
+            Screen.PutChar(110,34,Precio_Actual[1]);
+            Screen.PutChar(120,34,Precio_Actual[2]);
+            Screen.PutChar(130,34,Precio_Actual[3]);
+            Screen.PutChar(140,34,'*');
+            Screen.Limits();
+            Screen.Show();
+            Computer.printf("%s\n",Precio_Actual);
+        }
+    }
+}
+
+void M_IntensidadSenal()
+{
+    char Senal[]="000";
+    Slave.Command(COMMAND_SIGNAL);
+    Screen.Rectangle(129,14,5,0);
+    Screen.PutString(15,12,"Intensidad senal");
+    Screen.PutString(15,34,"Conectando...");
+    Screen.Limits();
+    Screen.Show();
+    Computer.printf("Conectando...\n");
+    wait(3);
+
+    Inicio=BaseClock.read_ms();
+    while(true) {
+        if(Slave.Available()) {
+            Computer.putc('A');
+            wait_ms(200);
+            break;
+        }
+        Fin=BaseClock.read_ms();
+        Transcurrido=Fin-Inicio;
+        if(Transcurrido>20000) {
+            Computer.putc('E');
+            break;
+        }
+    }
+    InByte=Slave.Recibe();
+    if(InByte=='A') {
+        Senal[2]=Slave.Recibe();
+        Senal[1]=Slave.Recibe();
+        Senal[0]=Slave.Recibe();
+        Screen.Rectangle(129,14,5,0);
+        Screen.PutString(15,12,"Intensidad senal");
+        Screen.PutString(15,34,"CSQ:");
+        Screen.PutChar(70,34,Senal[0]);
+        Screen.PutChar(80,34,Senal[1]);
+        Screen.PutChar(92,34,'.');
+        Screen.PutChar(96,34,Senal[2]);
+        Screen.Limits();
+        Screen.Show();
+        Computer.printf("CSQ: %s\n",Senal);
+        wait(3);
+    } else {
+        Screen.Rectangle(129,14,5,0);
+        Screen.PutString(15,12,"Intensidad senal");
+        Screen.PutString(15,34,"Error.");
+        Screen.Limits();
+        Screen.Show();
+        Computer.printf("Error\n");
+        wait(3);
+    }
+}
+void M_ConexionSim900()
+{
+    Screen.PutString(15,12,"Conexion red");
+    Screen.PutString(15,34,"Conetando...");
+    Screen.Limits();
+    Screen.Show();
+    Computer.printf("Conectando...\n");
+
+    Slave.Command(COMMAND_CONNECT);
+    while(true) {
+        if(Slave.Available()) {
+            wait_ms(200);
+            break;
+        }
+        Fin=BaseClock.read_ms();
+        Transcurrido=Fin-Inicio;
+        if(Transcurrido>20000) {
+            Computer.putc('E');
+            break;
+        }
+    }
+    InByte=Slave.Recibe();
+    if(InByte=='A') {
+        Screen.PutString(15,12,"Conexion red");
+        Screen.PutString(15,34,"Conectado.");
+        Screen.Limits();
+        Screen.Show();
+        wait(3);
+    } else {
+        Screen.PutString(15,12,"Conexion red");
+        Screen.PutString(15,34,"Error.");
+        Screen.Limits();
+        Screen.Show();
+        wait(3);
+    }
+}
+
+void M_PruebaTiquete()
+{
+    Screen.PutString(15,12,"Tiquete de prueba");
+    Screen.PutString(15,34,"Conectando...");
+    Screen.Limits();
+    Screen.Show();
+    wait(1);
+    Computer.printf("Conectando...\n");
+
+    Impresora.Power(1);
+    wait_ms(1000);
+    Comando=Impresora.Reset();
+
+    if(Comando==2) {
+        Screen.PutString(15,12,"Tiquete de prueba");
+        Screen.PutString(15,34,"Error.");
+        Screen.Limits();
+        Screen.Show();
+        Computer.printf("Error\n");
+
+        Impresora.End();
+        AlarmasCall(2,1);
+        wait(3);
+    }
+    if(Comando==1) {
+        Screen.PutString(15,12,"Tiquete de prueba");
+        Screen.PutString(15,34,"Imprimiendo...");
+        Screen.Limits();
+        Screen.Show();
+        Computer.printf("Imprimiendo...\n");
+
+        Comando=Impresora.Output(FechaRespuesta,"00:00","00:00","0000","00:00","000000","0000*");
+        if(Comando==0) {
+            Computer.printf("Alarma Output\n");
+            AlarmasCall(2,1);
+        } else {
+            AlarmasCall(2,0);
+        }
+
+        Comando=Impresora.Paper(600);
+        if(Comando==0) {
+            Computer.printf("Alarma Papel\n");
+            AlarmasCall(2,1);
+        } else {
+            AlarmasCall(2,0);
+        }
+
+        Comando=Impresora.Cutter(1);
+        if(Comando==0) {
+            Computer.printf("Alarma Cutter\n");
+            AlarmasCall(2,1);
+        } else {
+            AlarmasCall(2,0);
+        }
+
+        Screen.PutString(15,12,"Tiquete de prueba");
+        Screen.PutString(15,34,"Retire.");
+        Screen.Limits();
+        Screen.Show();
+        Computer.printf("Retire\n");
+        wait(1);
+        Comando=Impresora.End();
+        wait(2);
+    }
+    if(Comando==0) {
+        Screen.PutString(15,12,"Tiquete de prueba");
+        Screen.PutString(15,34,"Error.");
+        Screen.Limits();
+        Screen.Show();
+        Computer.printf("Error\n");
+        Comando=Impresora.End();
+        AlarmasCall(2,1);
+        wait(3);
+    }
+    Impresora.Power(0);
+
+    int TiquetesDisponibles=Papel-Impresora.Ticket(1);
+    if(TiquetesDisponibles<200) {
+        sprintf(PapelDisponible,"%i",TiquetesDisponibles);
+        AlarmasCall(3,1);
+    } else {
+        sprintf(PapelDisponible,"%i",TiquetesDisponibles);
+        AlarmasCall(3,0);
+    }
+}
+
+void M_ConexionImpresora()
+{
+    Screen.PutString(15,12,"Conexion impresora");
+    Screen.PutString(15,34,"Conectando...");
+    Screen.Limits();
+    Screen.Show();
+    Computer.printf("Conectando...\n");
+
+    Impresora.Power(1);
+    wait_ms(1000);
+    Comando=Impresora.Reset();
+
+    if(Comando==2) {
+        Screen.PutString(15,12,"Conexion impresora");
+        Screen.PutString(15,34,"Desconectada.");
+        Screen.Limits();
+        Screen.Show();
+        Computer.printf("Desconectada\n");
+        Impresora.End();
+        AlarmasCall(2,1);
+        wait(3);
+    }
+    if(Comando==1) {
+        Screen.PutString(15,12,"Conexion impresora");
+        Screen.PutString(15,34,"Conectada.");
+        Screen.Limits();
+        Screen.Show();
+        Computer.printf("Conectada\n");
+        Comando=Impresora.End();
+        AlarmasCall(2,0);
+        wait(3);
+    }
+    if(Comando==0) {
+        Screen.PutString(15,12,"Conexion impresora");
+        Screen.PutString(15,34,"Conectada error.");
+        Screen.Limits();
+        Screen.Show();
+        Computer.printf("Error\n");
+        Comando=Impresora.End();
+        AlarmasCall(2,1);
+        wait(3);
+    }
+    Impresora.Power(0);
+}
+
+void M_CambioPapel(uint32_t TimeOut)
+{
+    char Papel_Actual[5];   //Lectura de valor en memoria
+    if(Papel>999) {
+        sprintf(Papel_Actual,"%i",Papel);
+    }
+    if(Papel<1000) {
+        sprintf(Papel_Actual,"0%i",Papel);
+    }
+    if(Papel<100) {
+        sprintf(Papel_Actual,"00%i",Papel);
+    }
+    if(Papel<10) {
+        sprintf(Papel_Actual,"000%i",Papel);
+    }
+
+    int SelectionLine1[4]= {99,32,9,0};
+    int SelectionLine2[4]= {99,50,9,0};
+    int Line=1;
+    bool Numero;
+    bool Arriba;
+    bool Abajo;
+    bool Salir;
+    bool Atras;
+    bool Finalizar;
+
+    Inicio=BaseClock.read_ms();
+
+    Screen.Rectangle(SelectionLine1[0],SelectionLine1[1],SelectionLine1[2],SelectionLine1[3]);
+    Screen.Rectangle(SelectionLine2[0],SelectionLine2[1],SelectionLine2[2],SelectionLine2[3]);
+    Screen.PutString(15,12,"Cambio de papel");
+    Screen.PutChar(100,34,Papel_Actual[0]);
+    Screen.PutChar(110,34,Papel_Actual[1]);
+    Screen.PutChar(120,34,Papel_Actual[2]);
+    Screen.PutChar(130,34,Papel_Actual[3]);
+    Screen.Limits();
+    Screen.Show();
+    Computer.printf("Cambio de papel\n");
+    Computer.printf("%s\n",Papel_Actual);
+
+    while(true) {
+        Fin=BaseClock.read_ms();
+        Transcurrido=Fin-Inicio;
+        if(Transcurrido>TimeOut) {
+            break;
+        }
+        Tecla=KeyPad_Read();
+        if (Tecla!=NO_KEY) {                  // Se valida que se ingrese algo en el teclado
+            Inicio=BaseClock.read_ms();
+
+            Numero=(Tecla=='0')||(Tecla=='1')||(Tecla=='2')||(Tecla=='3')||(Tecla=='4')||(Tecla=='5')||(Tecla=='6')||(Tecla=='7')||(Tecla=='8')||(Tecla=='9');
+            if (Numero) {                     //Cambiar numero
+                Papel_Actual[Line-1]=Tecla;
+                Line++;
+                if(Line==5) {
+                    Line=1;
+                }
+                if(Line==0) {
+                    Line=4;
+                }
+            }
+            Arriba=(Tecla=='E');
+            if (Arriba) {                    //Subir puntero
+                Line++;
+                if(Line==5) {
+                    Line=1;
+                }
+            }
+            Abajo=(Tecla=='F');
+            if (Abajo) {                     //Bajar puntero
+                Line--;
+                if(Line==0) {
+                    Line=4;
+                }
+            }
+            Salir=(Tecla=='C');              //Cancelar Operacion
+            if (Salir) {
+                break;
+            }
+            Atras=(Tecla=='B');
+            if (Atras) {                     //Atras en menu
+                break;
+            }
+            Finalizar=(Tecla=='D');          //En caso de confirmacion
+            if (Finalizar) {
+                Papel=((uint8_t)Papel_Actual[0]-48)*1000+((uint8_t)Papel_Actual[1]-48)*100+((uint8_t)Papel_Actual[2]-48)*10+((uint8_t)Papel_Actual[3]-48);
+                int TiquetesDisponibles=Papel-Impresora.Ticket(1);
+                if(TiquetesDisponibles<200) {
+                    sprintf(PapelDisponible,"%i",TiquetesDisponibles);
+                    AlarmasCall(3,1);
+                } else {
+                    sprintf(PapelDisponible,"%i",TiquetesDisponibles);
+                    AlarmasCall(3,0);
+                }
+                break;
+            }
+            switch (Line) {
+                case 1:
+                    SelectionLine1[0]=99;
+                    SelectionLine2[0]=99;
+                    break;
+                case 2:
+                    SelectionLine1[0]=109;
+                    SelectionLine2[0]=109;
+                    break;
+                case 3:
+                    SelectionLine1[0]=119;
+                    SelectionLine2[0]=119;
+                    break;
+                case 4:
+                    SelectionLine1[0]=129;
+                    SelectionLine2[0]=129;
+                    break;
+            }
+            //-------Mostrar en Patalla-------
+            Screen.Rectangle(SelectionLine1[0],SelectionLine1[1],SelectionLine1[2],SelectionLine1[3]);
+            Screen.Rectangle(SelectionLine2[0],SelectionLine2[1],SelectionLine2[2],SelectionLine2[3]);
+            Screen.PutString(15,12,"Cambio de papel");
+            Screen.PutChar(100,34,Papel_Actual[0]);
+            Screen.PutChar(110,34,Papel_Actual[1]);
+            Screen.PutChar(120,34,Papel_Actual[2]);
+            Screen.PutChar(130,34,Papel_Actual[3]);
+            Screen.Limits();
+            Screen.Show();
+            Computer.printf("%s\n",Papel_Actual);
+        }
+    }
+}
+void M_PruebaTeclado(uint32_t TimeOut)
+{
+    bool Numero;
+    int  Line=0;
+    char Secuencia[16]= {'1','2','3','A','4','5','6','B','7','8','9','C','F','0','E','D'};
+    char SecuenciaSelect[2];
+    SecuenciaSelect[0]='1';
+    SecuenciaSelect[1]='\0';
+    Inicio=BaseClock.read_ms();
+
+    Screen.Limits();
+    Screen.PutString(15,12,"Prueba de teclado");
+    Screen.PutString(15,34,">    <");
+    Screen.PutString(33,34,SecuenciaSelect);
+    Screen.Show();
+    Computer.putc(SecuenciaSelect[0]);
+
+    while(true) {
+        Fin=BaseClock.read_ms();
+        Transcurrido=Fin-Inicio;
+        if(Transcurrido>TimeOut) {
+            Screen.Limits();
+            Screen.PutString(15,12,"Prueba de teclado");
+            Screen.PutString(15,34,"Error.");
+            Screen.Show();
+            Computer.printf("\nError\n");
+            wait(3);
+        }
+        Tecla = KeyPad_Read();
+        if (Tecla!=NO_KEY) {                  // Se valida que se ingrese algo en el teclado
+            Inicio=BaseClock.read_ms();
+
+            Numero=(Tecla==Secuencia[Line]);
+            if (Numero) {                     //Cambiar numero
+                Line++;
+                SecuenciaSelect[0]=Secuencia[Line];
+            }
+
+            if (Line>15) {                     //Cambiar numero
+                Screen.Limits();
+                Screen.PutString(15,12,"Prueba de teclado");
+                Screen.PutString(15,34,"Aprobada.");
+                Screen.Show();
+                Computer.printf("\nAprobada\n");
+                wait(3);
+                break;
+            }
+
+            Screen.Limits();
+            Screen.PutString(15,12,"Prueba de teclado");
+            Screen.PutString(15,34,">    <");
+            Screen.PutString(33,34,SecuenciaSelect);
+            Screen.Show();
+            Computer.putc(SecuenciaSelect[0]);
+        }
+    }
+
+}
+
+void M_ConexionLectora()
+{
+    CardReaderPower=1;
+    Screen.Limits();
+    Screen.PutString(15,12,"Conexion lectora");
+    Screen.PutString(15,34,"Conectando...");
+    Screen.Show();
+    Computer.printf("Conectando...\n");
+    wait(2);
+    CardReader_Counter=0;
+    if(CardReader.writeable()) {
+        CardReader.putc(SOH);           // 00000001
+        CardReader.putc(ADDR);          // 00000000
+        CardReader.putc(LEN);           // 00000000
+        CardReader.putc(LEN);           // 00000000
+        CardReader.putc(DEV_RESET);     // 01111111
+        CardReader.putc(EOT);           // 00000100
+        CardReader.putc(BBCI);          // 01111010
+    }
+    int RespuestaConexion;
+    wait_ms(2000);
+    if(CardReader_Counter>0) {
+        for(int i=0; i<=CardReader_Counter; i++) {
+            if(CardReader_Buffer[i]==R_START) {
+                RespuestaConexion=1;
+                AlarmasCall(1,0);
+            }
+            if(CardReader_Buffer[i]==R_INVALID) {
+                RespuestaConexion=2;
+                AlarmasCall(1,1);
+            }
+            if(CardReader_Buffer[i]==R_ERROR) {
+                RespuestaConexion=2;
+                AlarmasCall(1,1);
+            }
+            if(CardReader_Buffer[i]==R_COMAND_ERROR) {
+                RespuestaConexion=2;
+                AlarmasCall(1,1);
+            }
+        }
+    } else {
+        RespuestaConexion=0;
+        AlarmasCall(1,1);
+    }
+
+    if(RespuestaConexion==0) {
+        Screen.Limits();
+        Screen.PutString(15,12,"Conexion lectora");
+        Screen.PutString(15,34,"Desconectada.");
+        Screen.Show();
+        Computer.printf("Desconectada\n");
+        wait(3);
+    }
+    if(RespuestaConexion==1) {
+        Screen.Limits();
+        Screen.PutString(15,12,"Conexion lectora");
+        Screen.PutString(15,34,"Conectada.");
+        Screen.Show();
+        Computer.printf("Conectada\n");
+        wait(3);
+    }
+    if(RespuestaConexion==2) {
+        Screen.Limits();
+        Screen.PutString(15,12,"Conexion lectora");
+        Screen.PutString(15,34,"Conectada error.");
+        Screen.Show();
+        Computer.printf("Conectada error\n");
+        wait(3);
+    }
+    CardReaderPower=0;
+}
+
+int M_RetiroTarjeta(uint32_t TiempoFuera)
+{
+    Computer.printf("Retiro tarjeta\n");
+    Inicio=BaseClock.read_ms();
+    while(true) {
+        if(PositionCard()==0) {
+            return 1;
+        } else {
+            Screen.Limits();                 // Se pide al usuario por pantalla el retiro de la tarjeta
+            Screen.PutString(15,12,"Prueba de lectura");
+            Screen.PutString(15,34,"Retire tarjeta.");
+            Screen.Show();
+        }
+        Fin=BaseClock.read_ms();
+        Transcurrido=Fin-Inicio;
+        if(Transcurrido>TiempoFuera) {
+            StateReader[1]='T';
+            return 0;
+        }
+    }
+}
+
+void M_PruebaLectora()
+{
+    CardReaderPower=1;
+    Screen.PutString(15,12,"Prueba de lectura");
+    Screen.PutString(15,34,"Conectando...");
+    Screen.Limits();                     // Se inicia el lector de tarjetas
+    Screen.Show();
+    wait(2);
+
+    Screen.Limits();                     // Se pide al usuario por pantalla la intrduccion de la tarjeta
+    Screen.PutString(15,12,"Prueba de lectura");
+    Screen.PutString(15,34,"Introduzca tarjeta.");
+    Screen.Show();
+
+    if(ResetCard()) {
+        while(true) {
+
+            uint8_t RespuestaIngresoTarjeta = IngresoTarjeta(10000);
+            if(RespuestaIngresoTarjeta==1) {
+                Screen.Limits();
+                Screen.PutString(15,12,"Prueba de lectura");
+                Screen.PutString(15,34,"Retire tarjeta.");
+                Screen.Show();
+            }
+            if(RespuestaIngresoTarjeta==0) {
+                Screen.PutString(15,12,"Prueba de lectura");
+                Screen.PutString(15,34,"Sin deteccion.");
+                Screen.Limits();
+                Screen.Show();
+                wait(3);
+                Screen.Clean();
+                break;
+            }
+            if(RespuestaIngresoTarjeta==2) {
+                Screen.PutString(15,12,"Prueba de lectura");
+                Screen.PutString(15,34,"Error.");
+                Screen.Limits();
+                Screen.Show();
+                wait(3);
+                break;
+            }
+
+            uint8_t RespuestaReadCard=ReadCard(5000);
+            if(RespuestaReadCard==2) {
+                Screen.PutString(15,12,"Prueba de lectura");
+                Screen.PutString(15,34,"Error.");
+                Screen.Limits();
+                Screen.Show();
+                wait(3);
+                break;
+            }
+
+
+            // Se le la tarjeta al retirarse
+            int DataResult=RecibeDataCard();    // Se corrobora que la informacion de la tajeta es la corre
+            if(DataResult==0) {
+                Screen.PutString(15,12,"Prueba de lectura");
+                Screen.PutString(15,34,"ilegible.");
+                Screen.Limits();
+                Screen.Show();
+                wait(2);
+                if(M_RetiroTarjeta(7000)) {
+                    Screen.Limits();
+                    Screen.PutString(15,12,"Prueba de lectura");
+                    Screen.PutString(15,34,"Introduzca tarjeta");
+                    Screen.Show();
+                } else {
+                    Screen.PutString(15,12,"Prueba de lectura");
+                    Screen.PutString(15,34,"Error.");
+                    Screen.Limits();
+                    Screen.Show();
+                    wait(3);
+                    break;
+                }
+            }
+            if(DataResult==1) {
+                Screen.PutString(15,12,"Prueba de lectura");
+                Screen.PutString(15,34,"Aprobada.");
+                Screen.Limits();
+                Screen.Show();
+                Computer.printf("\nAprobada\n");
+                wait(3);
+                break;
+            }
+            if(DataResult==2) {
+                Screen.PutString(15,12,"Prueba de lectura");
+                Screen.PutString(15,34,"ilegible");
+                Screen.Limits();
+                Screen.Show();
+                wait(2);
+                if(M_RetiroTarjeta(7000)) {
+                    Screen.Limits();
+                    Screen.PutString(15,12,"Prueba de lectura");
+                    Screen.PutString(15,34,"Introduzca tarjeta");
+                    Screen.PutChar(26,33,'!');
+                    Screen.PutChar(110,33,'!');
+                    Screen.Show();
+                } else {
+                    Screen.PutString(15,12,"Prueba de lectura");
+                    Screen.PutString(15,34,"Error.");
+                    Screen.Limits();
+                    Screen.Show();
+                    wait(3);
+                    break;
+                }
+            }
+        }
+    } else {
+        Screen.PutString(15,12,"Prueba de lectura");
+        Screen.PutString(15,34,"Error.");
+        Screen.Limits();
+        Screen.Show();
+        wait(3);
+    }
+    CardReaderPower=0;    
+}
+
+void M_Informacion()
+{
+    int TiquetesDisponibles=Papel-Impresora.Ticket(1);
+    if(TiquetesDisponibles<200) {
+        sprintf(PapelDisponible,"%i",TiquetesDisponibles);
+        AlarmasCall(3,1);
+    } else {
+        sprintf(PapelDisponible,"%i",TiquetesDisponibles);
+        AlarmasCall(3,0);
+    }
+
+    Screen.PutString(15,4,"Transaccion:");
+    Screen.PutString(129,4,FechaRespuesta);
+    Screen.PutString(15,23,"Papel:");
+    Screen.PutString(129,23,PapelDisponible);
+    Screen.PutString(15,42,"Estado:");
+    Screen.PutString(129,42,Alarmas);
+    Screen.Limits();//AlarmasCall
+    Screen.Show();
+    wait(5);
+}
+
+bool M_ClaveIngreso(uint32_t TimeOut)
+{
+    char Clave_Actual[5]="))))";
+    int SelectionLine1[4]= {99,32,8,0};
+    int SelectionLine2[4]= {99,50,8,0};
+    int Line=1;
+    bool Numero;
+    bool Arriba;
+    bool Abajo;
+    bool Salir;
+    bool Atras;
+    bool Finalizar;
+    Inicio=BaseClock.read_ms();
+
+    Screen.Rectangle(SelectionLine1[0],SelectionLine1[1],SelectionLine1[2],SelectionLine1[3]);
+    Screen.Rectangle(SelectionLine2[0],SelectionLine2[1],SelectionLine2[2],SelectionLine2[3]);
+    Screen.PutString(15,12,"Ingrese password");
+    Screen.PutChar(100,34,Clave_Actual[0]);
+    Screen.PutChar(110,34,Clave_Actual[1]);
+    Screen.PutChar(120,34,Clave_Actual[2]);
+    Screen.PutChar(130,34,Clave_Actual[3]);
+    Screen.Limits();
+    Screen.Show();
+    Computer.printf("Ingrese password\n");
+    Computer.printf("%s\n",Clave);
+
+    while(true) {
+        Fin=BaseClock.read_ms();
+        Transcurrido=Fin-Inicio;
+        if(Transcurrido>TimeOut) {
+            return 0;
+        }
+        Tecla=KeyPad_Read();
+        if (Tecla!=NO_KEY) {                  // Se valida que se ingrese algo en el teclado
+            Inicio=BaseClock.read_ms();
+
+            Numero=(Tecla=='0')||(Tecla=='1')||(Tecla=='2')||(Tecla=='3')||(Tecla=='4')||(Tecla=='5')||(Tecla=='6')||(Tecla=='7')||(Tecla=='8')||(Tecla=='9');
+            if (Numero) {                     //Cambiar numero
+                Clave_Actual[Line-1]=Tecla;
+                Line++;
+                Screen.Rectangle(SelectionLine1[0],SelectionLine1[1],SelectionLine1[2],SelectionLine1[3]);
+                Screen.Rectangle(SelectionLine2[0],SelectionLine2[1],SelectionLine2[2],SelectionLine2[3]);
+                Screen.PutString(15,12,"Ingrese password");
+                Screen.PutChar(100,34,Clave_Actual[0]);
+                Screen.PutChar(111,34,Clave_Actual[1]);
+                Screen.PutChar(122,34,Clave_Actual[2]);
+                Screen.PutChar(133,34,Clave_Actual[3]);
+                Screen.Limits();
+                Screen.Show();
+                if(Line==5) {
+                    Line=1;
+                }
+                if(Line==0) {
+                    Line=4;
+                }
+                wait_ms(100);
+            }
+            Arriba=(Tecla=='E');
+            if (Arriba) {                    //Subir puntero
+                Line++;
+                if(Line==5) {
+                    Line=1;
+                }
+            }
+            Abajo=(Tecla=='F');
+            if (Abajo) {                     //Bajar puntero
+                Line--;
+                if(Line==0) {
+                    Line=4;
+                }
+            }
+            Salir=(Tecla=='C');              //Cancelar Operacion
+            if (Salir) {
+                return 0;
+            }
+            Atras=(Tecla=='B');
+            if (Atras) {                     //Atras en menu
+                return 0;
+            }
+            Finalizar=(Tecla=='D');          //En caso de confirmacion
+            if (Finalizar) {
+                if((Clave_Actual[0]==Clave[0])&&(Clave_Actual[1]==Clave[1])&&(Clave_Actual[2]==Clave[2])&&(Clave_Actual[3]==Clave[3])) {
+                    return 1;
+                } else {
+                    return 0;
+                }
+            }
+            switch (Line) {
+                case 1:
+                    SelectionLine1[0]=99;
+                    SelectionLine2[0]=99;
+                    break;
+                case 2:
+                    SelectionLine1[0]=110;
+                    SelectionLine2[0]=110;
+                    break;
+                case 3:
+                    SelectionLine1[0]=121;
+                    SelectionLine2[0]=121;
+                    break;
+                case 4:
+                    SelectionLine1[0]=132;
+                    SelectionLine2[0]=132;
+                    break;
+            }
+            //-------Mostrar en Patalla-------
+            Screen.Rectangle(SelectionLine1[0],SelectionLine1[1],SelectionLine1[2],SelectionLine1[3]);
+            Screen.Rectangle(SelectionLine2[0],SelectionLine2[1],SelectionLine2[2],SelectionLine2[3]);
+            Screen.PutString(15,12,"Ingrese password");
+            Screen.PutChar(100,34,')');
+            Screen.PutChar(111,34,')');
+            Screen.PutChar(122,34,')');
+            Screen.PutChar(133,34,')');
+            Screen.Limits();
+            Screen.Show();
+            Computer.printf("%s\n",Clave);
+        }
+    }
+}
+
+//------------------------------------------------------------------------------------------------------------------------------------------------------
+void Interrupt_Host()
+{
+    Counter_Host++;
+    MinutosTranscurrido++;
+    Battery_State = Charger.Control();    
+    if(Counter_Host>Hostin_Conection) {
+        Alarm=1;       
+        Counter_Host=0; 
+    }
+    if(MinutosTranscurrido>11){
+            HoraHostingPantalla++;
+            MinutosTranscurrido=0;
+    }
+    if((Battery_State==0)&&(Battery_State!=Battery_State_Before)){
+        //AlarmasCall(6,1);
+    }
+    if((Battery_State==1)||(Battery_State==2)) {
+        //AlarmasCall(6,0);
+    }
+    Computer.printf("\n-%i-%i-",HoraHostingPantalla,Battery_State);
+    Panel_Voltage=Charger.PanelRead();
+    Battery_Voltage=Charger.BatteryRead();
+    Computer.printf("B:%.2f  P:%.2f\n",Battery_Voltage,Panel_Voltage);
+    Battery_State_Before=Battery_State;
+}
+
+void H_EnviarPaso(uint8_t Entrada_Comando)
+{
+    switch (Entrada_Comando) {
+        case 1:
+            Slave.Command(HOSTING_STEP1);
+            Progreso[0]=' ';
+            Progreso[1]='1';
+            Progreso[2]='0';
+            break;
+        case 2:
+            Slave.Command(HOSTING_STEP2);
+            Progreso[0]=' ';
+            Progreso[1]='2';
+            Progreso[2]='0';
+            break;
+        case 3:
+            Slave.Command(HOSTING_STEP3);
+            Progreso[0]=' ';
+            Progreso[1]='3';
+            Progreso[2]='0';
+            break;
+        case 4:
+            Slave.Command(HOSTING_STEP4);
+            Progreso[0]=' ';
+            Progreso[1]='4';
+            Progreso[2]='0';
+            break;
+        case 5:
+            Slave.Command(HOSTING_STEP5);
+            Progreso[0]=' ';
+            Progreso[1]='5';
+            Progreso[2]='0';
+            break;
+        case 6:
+            Slave.Command(HOSTING_STEP6);
+            Progreso[0]=' ';
+            Progreso[1]='6';
+            Progreso[2]='0';
+            break;
+        case 7:
+            Slave.Command(HOSTING_STEP7);
+            Progreso[0]=' ';
+            Progreso[1]='7';
+            Progreso[2]='0';
+            break;
+        case 8:
+            Slave.Command(HOSTING_STEP8);
+            Slave.Send_Hosting(Parquimetro,Municipio,Alarmas);
+            Computer.printf("-%s-%s-%s-\n",Parquimetro,Municipio,Alarmas);
+            Progreso[0]=' ';
+            Progreso[1]='8';
+            Progreso[2]='0';
+            break;
+        case 9:
+            Slave.Command(HOSTING_STEP9);
+            Progreso[0]=' ';
+            Progreso[1]='9';
+            Progreso[2]='0';
+            break;
+        case 10:
+            Slave.Command(HOSTING_STEP10);
+            Progreso[0]='1';
+            Progreso[1]='0';
+            Progreso[2]='0';
+            break;
+        case 11:
+            Slave.Command(HOSTING_STEP11);
+            Progreso[0]='1';
+            Progreso[1]='0';
+            Progreso[2]='0';
+            break;
+    }
+}
+
+void EsperarSim900(int TimeOut)
+{
+    Computer.printf("Espera sim900\n");
+    Inicio=BaseClock.read_ms();
+    Keypad_Init();     
+    while(true) {
+        Fin=BaseClock.read_ms();
+        Transcurrido=Fin-Inicio; 
+        if(Transcurrido>TimeOut) {
+            Computer.printf("Espera sim900 salir\n");
+            BaseClock.stop();
+            break;
+        }
+        Tecla=KeyPad_Read();
+        if (Tecla!=NO_KEY) { 
+            Computer.printf("Espera sim900 teclado\n");
+            Screen.On(HoraHostingPantalla);
+            wait_ms(20);
+            Screen.Init();
+            PantallaInicio();
+            Usuario(USER_INIT);
+            Inicio=BaseClock.read_ms();         
+        }
+    }
+}
+
+void Hosting()
+{
+    uint8_t PasoHostingNum=1;
+    H_EnviarPaso(PasoHostingNum);
+    Computer.printf("Hosting iniciando\n");
+    Computer.printf("Paso %i\n", PasoHostingNum);
+
+    BaseClock.start();
+    while(true) {
+        if(PasoHostingNum>10) {
+            Computer.printf("Paso final\n");
+            Inicio=BaseClock.read_ms();
+            while(true) {
+                if(Slave.Mensaje()) {
+                    wait_ms(75);
+                    break;
+                }
+                Fin=BaseClock.read_ms();
+                Transcurrido=Fin-Inicio;//49
+                if(Transcurrido>10000) {
+                    break;
+                }
+            }
+            HoraHosting[4]=Slave.Recibe();
+            HoraHosting[3]=Slave.Recibe();
+            HoraHosting[2]=Slave.Recibe();
+            HoraHosting[1]=Slave.Recibe();
+            HoraHosting[0]=Slave.Recibe();
+            HoraHosting[5]=Slave.Recibe();
+            HoraHosting[5]='\0';
+            RespuestaHosting[5]=Slave.Recibe();
+            RespuestaHosting[4]=Slave.Recibe();
+            RespuestaHosting[3]=Slave.Recibe();
+            RespuestaHosting[2]=Slave.Recibe();
+            RespuestaHosting[1]=Slave.Recibe();
+            RespuestaHosting[0]=Slave.Recibe();
+            //alertPQ response OK+390+11:42
+            // pperez@gmail.com 4321
+            // 34.211.174.1 port 3306  
+            // Base de datos s0p0rt310          
+            Computer.printf("-%s-\n",RespuestaHosting);
+            Computer.printf("H-%s-H\n",HoraHosting);
+            if(HoraHosting[2]==':'){
+                HoraHostingPantalla=((uint8_t)HoraHosting[0]-48)*600+((uint8_t)HoraHosting[1]-48)*60+((uint8_t)HoraHosting[3]-48)*10 + ((uint8_t)HoraHosting[4]-48);
+                Computer.printf("Mayor",HoraHostingPantalla);
+            }
+
+            Inicio=BaseClock.read_ms();
+            while(true) {
+                if(Slave.Answer()) {
+                    wait_ms(50);
+                    break;
+                }
+                Fin=BaseClock.read_ms();
+                Transcurrido=Fin-Inicio;//49
+                if(Transcurrido>10000) {
+                    break;
+                }
+            }
+            if((RespuestaHosting[0]=='O')&&RespuestaHosting[1]=='K') {
+                Computer.printf("Alarmas aprobada\n");
+                Alarm=false;
+                break;
+            } else {
+                Computer.printf("Alarmas fallo\n");
+                break;
+            }
+        }
+        
+        Tecla=KeyPad_Read();
+        if(Tecla!=NO_KEY) {
+            Screen.On(HoraHostingPantalla);
+            wait_ms(20);
+            Screen.Init();
+            if(PasoHostingNum==1) {
+                Computer.printf("Teclado encender Paso==1\n");
+                Usuario(USER_INIT);
+                break;
+            }            
+            if(PasoHostingNum<3) {
+                Computer.printf("Teclado Paso<3\n");
+                Usuario(USER_INIT2);
+                break;
+            }
+            if(PasoHostingNum<6) {
+                Computer.printf("Teclado Paso<6\n");
+                Usuario(USER_INIT3);
+                break;
+            }
+            if(PasoHostingNum==6) {
+                Computer.printf("Teclado Paso==6\n");
+                Usuario(USER_INIT4);
+                break;
+            }
+            if(PasoHostingNum<=8) {
+                Computer.printf("Teclado Paso<=8\n");
+                Usuario(USER_INIT5);
+                break;
+            }
+            if(PasoHostingNum<=10) {
+                Computer.printf("Teclado Paso<=10\n");
+                Usuario(USER_INIT5);
+                break;
+            }
+            if(PasoHostingNum<=11) {
+                Computer.printf("Teclado Paso<=11\n");
+                PantallaInicio();
+                Usuario(USER_INIT5);
+            }
+        }
+        
+        if (Slave.Answer()) {
+            PasoHostingNum++;
+            Computer.printf("Paso %i\n", PasoHostingNum);
+            H_EnviarPaso(PasoHostingNum);
+        }
+    }
+    Slave.Command(COMMAND_OFF);
+}
+
+void M_PruebaHosting()
+{
+    int Paso=1;
+    int PasoSiguiente=1;
+
+    while(true) {
+        if (Paso==PasoSiguiente) {
+            Computer.printf("Paso %i\n",Paso);
+            H_EnviarPaso(Paso);
+            Paso=Paso+1;
+            if(Paso>11) {
+                Computer.printf("Paso %i final\n",Paso);
+                Inicio=BaseClock.read_ms();
+                while(true) {
+                    if(Slave.Mensaje()) {
+                        wait_ms(75);
+                        break;
+                    }
+                    Fin=BaseClock.read_ms();
+                    Transcurrido=Fin-Inicio;//49
+                    if(Transcurrido>10000) {
+                        break;
+                    }
+                }
+                HoraHosting[5]=Slave.Recibe();
+                HoraHosting[4]=Slave.Recibe();
+                HoraHosting[3]=Slave.Recibe();
+                HoraHosting[2]=Slave.Recibe();
+                HoraHosting[1]=Slave.Recibe();
+                HoraHosting[0]=Slave.Recibe();
+                RespuestaHosting[5]=Slave.Recibe();
+                RespuestaHosting[4]=Slave.Recibe();
+                RespuestaHosting[3]=Slave.Recibe();
+                RespuestaHosting[2]=Slave.Recibe();
+                RespuestaHosting[1]=Slave.Recibe();
+                RespuestaHosting[0]=Slave.Recibe();
+                
+                Computer.printf("-%s-\n",RespuestaHosting);
+                Computer.printf("-%s-\n",HoraHosting);
+
+                Inicio=BaseClock.read_ms();
+                while(true) {
+                    if(Slave.Answer()) {
+                        wait_ms(50);
+                        break;
+                    }
+                    Fin=BaseClock.read_ms();
+                    Transcurrido=Fin-Inicio;//49
+                    if(Transcurrido>10000) {
+                        break;
+                    }
+                }
+                if((RespuestaHosting[0]=='O')&&RespuestaHosting[1]=='K') {
+                    Computer.printf("Alarmas aprobada\n");
+                    Screen.PutString(15,12,"Prueba hosting");
+                    Screen.PutString(15,34,"Aprobada.");
+                    Screen.Limits();
+                    Screen.Show();
+                    wait_ms(2000);
+                    Alarm=false;
+                    break;
+                } else {
+                    Computer.printf("Alarmas fallo\n");
+                    Screen.PutString(15,12,"Prueba hosting");
+                    Screen.PutString(15,34,"Error.");
+                    Screen.Limits();
+                    Screen.Show();
+                    wait_ms(2000);
+                    break;
+                }
+            }
+            Screen.PutString(15,12,"Prueba hosting");
+            Screen.PutString(15,34,"Progreso:");
+            Screen.PutChar(105,34,Progreso[0]);
+            Screen.PutChar(115,34,Progreso[1]);
+            Screen.PutChar(125,34,Progreso[2]);
+            Screen.PutChar(135,34,'%');
+            Screen.Limits();
+            Screen.Show();
+        }
+        if (Slave.Answer()) {
+            PasoSiguiente=PasoSiguiente+1;
+            Computer.printf("Next\n");
+        }
+    }
+}
+
+void Mantenimiento()
+{
+    Screen.On(HoraHostingPantalla);
+    wait_ms(20);
+    Screen.Init();
+    BaseClock.start();
+    M_PantallaConfiguracion();
+    bool ClaveAceptada=M_ClaveIngreso(5000);
+    while(ClaveAceptada) {
+        Comando=M_MenuConfiguracion(30000);
+        switch(Comando) {
+            case M_SISTEMA:
+                Computer.printf("--> Sistema\n");
+                Comando=M_MenuSistema(30000);
+                if(Comando==M_PARQUIMETRO) {
+                    Computer.printf("--> Id parquimetro\n");
+                    M_Parquimetro(30000);
+                }
+                if(Comando==M_MUNICIPIO) {
+                    Computer.printf("--> Id municipalidad\n");
+                    M_Municipio(30000);
+                }
+                if(Comando==M_PRECIO) {
+                    Computer.printf("--> Precio 10mins\n");
+                    M_Precio(30000);
+                }
+                break;
+
+            case M_RED:
+                Computer.printf("--> Red\n");
+                Comando=M_MenuConexion(30000);
+                if(Comando==M_SENAL) {
+                    Computer.printf("--> Intensidad senal\n");
+                    M_IntensidadSenal();
+                }
+                if(Comando==M_HOSTING) {
+                    Computer.printf("--> Prueba hosting\n");
+                    M_PruebaHosting();
+                }
+                if(Comando==M_CONEXION_SIM) {
+                    Computer.printf("--> Conexion modulo\n");
+                    M_ConexionSim900();
+                }
+                break;
+
+            case M_IMPRESORA:
+                Computer.printf("--> Impresora\n");
+                Comando=M_MenuImpresora(30000);
+                if(Comando==M_PAPEL) {
+                    Computer.printf("--> Cambio de papel\n");
+                    M_CambioPapel(30000);
+                }
+                if(Comando==M_IMPRESION) {
+                    Computer.printf("--> Tiquete de prueba\n");
+                    M_PruebaTiquete();
+                }
+                if(Comando==M_CONEXION_IMP) {
+                    Computer.printf("--> Conexion impresora\n");
+                    M_ConexionImpresora();
+                }
+                break;
+
+            case M_TECLADO:
+                Computer.printf("--> Teclado\n");
+                Comando=M_MenuTeclado(30000);
+                if(Comando==M_PRUEBA_TECLA) {
+                    Computer.printf("--> Prueba de teclado\n");
+                    M_PruebaTeclado(3000);
+                }
+                break;
+
+            case M_LECTORA:
+                Computer.printf("--> Lectora\n");
+                Comando=M_MenuLectora(30000);
+                if(Comando==M_LECTURA) {
+                    Computer.printf("--> Prueba de lectura\n");
+                    M_PruebaLectora();
+                }
+                if(Comando==M_CONEXION_LEC) {
+                    Computer.printf("--> Conexion lectora\n");
+                    M_ConexionLectora();
+                }
+                break;
+
+            case M_INFORMACION:
+                Comando=M_MenuInformacion();
+                if(Comando==M_INFORMACION) {
+                    Computer.printf("--> Informacion\n");
+                    M_Informacion();
+                }
+                break;
+
+            default:
+                Comando=M_OFF;
+        }
+
+        if(Comando==M_OFF) {
+            Computer.printf("Cerrando modo configuracion\n");
+            Screen.Clean();
+            MantenimientoInterruption=0;
+            BaseClock.stop();
+            Screen.Off();
+            break;
+        }
+    }
+    Screen.Clean();
+    MantenimientoInterruption=0;
+    Screen.Off();
+    wait(1);
+}
+
+int main()
+{
+    Screen.On(HoraHostingPantalla);
+    Screen.Init();
+    Screen.Clean();
+    Keypad_C1.rise(&KeyPad_InterruptDisable);
+    Keypad_C2.rise(&KeyPad_InterruptDisable);
+    Keypad_C3.rise(&KeyPad_InterruptDisable);
+    Keypad_C4.rise(&KeyPad_InterruptDisable);
+    Configuracion.rise(&Interrupt_Mantenimiento);
+    CardReader.attach(&Interrupt_CardReader);
+    Host.attach(&Interrupt_Host,5);//1800 30 minutos
+    Computer.printf("Prototipo Completo\n");
+    Screen.Off();
+    while(1) {
+        KeyPad_InterruptEnable();
+        Doors.InterruptEnable();
+        hal_sleep();
+        Tecla=KeyPad_Read();
+        if(Tecla!=NO_KEY) {
+            LedUsuario=1;
+            MAX232=0;
+            Usuario(USER_INIT);
+            EsperarSim900(5000);
+            LedUsuario=0;
+            MAX232=1;
+        }
+        if(MantenimientoInterruption) {
+            LedMantenimiento=1;
+            Mantenimiento();
+            LedMantenimiento=0;
+        }
+        if(Doors.Read()>0) {
+            Alarm=1;
+            AlarmasCall((3+Doors.Read()),1);
+        } else {
+            AlarmasCall(4,0);
+            AlarmasCall(5,0);
+        }
+        if(Alarm) {
+            LedHosting=1;
+            Hosting();
+            EsperarSim900(5000);
+            LedHosting=0;
+        }
+    }
+}
diff -r 000000000000 -r a37ed180e6e3 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Tue Jun 04 17:45:47 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/mbed_official/code/mbed/builds/a7c7b631e539
\ No newline at end of file