CardReader_Funcional

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
williequesada
Date:
Tue Jun 04 18:01:55 2019 +0000
Commit message:
pablo

Changed in this revision

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 8e949d38885c main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Jun 04 18:01:55 2019 +0000
@@ -0,0 +1,572 @@
+#include "mbed.h"
+
+#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
+// Conector ZHR-6 de JST http://www.jst.com/
+//   _ _ _ _ _ _
+//  ! ! ! ! ! ! !             1->CTS    2->TXD    3->DTR
+//   6 5 4 3 2 1              4->RXD    5->GND    6->PWR
+
+Serial Computer(USBTX, USBRX);      // tx, rx
+Serial CardReader(PC_12,PD_2,9600);
+
+const char SOH=1;
+const char EOT=4;
+const char ESP=33;
+const char ADDR=0;
+const char LEN=0;
+const char CARD_POSITION='8';
+const char CARD_LOCK='{';
+const char CARD_UNLOCK='}';
+const char DEV_STATUS='$';
+const char DEV_RESET=127;
+const char ARM_MODE='P';
+const char ARM_DEBUG='p';
+const char ARM_ABORT=27;
+const char SIG_START='?';
+const char FCT_READ='R';
+const char MAG_CUSTOM_T1='U';
+const char MAG_CUSTOM_T2='V';
+const char MAG_CUSTOM_T3='W';
+const char MAG_ISO_T1='Q';
+const char MAG_ISO_T2='R';
+const char MAG_ISO_T3='S';
+const char MAG_CUSTOM_F='4';
+const char BBCA='=';
+const char BBCB='~';
+const char BBCC='x';
+const char BBCD='!';
+const char BBCE='U';
+const char BBCF='u';
+const char BBCG=30;
+const char BBCH='d';
+const char BBCI='z';
+const char BBCJ='T';
+const char BBCK='W';
+const char BBCL='V';
+const char BBCM=10;
+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 Track2[38]="0000000000000000000000000000000000000";
+
+DigitalOut   CardReaderPower(PF_3);//
+DigitalOut   Max232(PC_8);
+
+
+char StateReader[7]= {'0','0','0','0','0','0','0'};
+char CardReader_Buffer[255];
+int CardReader_Counter=0;
+char Comando=' ';
+unsigned long Inicio, Fin, Transcurrido;
+Timer BaseClock;
+
+
+
+void Interrupt_CardReader()
+{
+    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\n");            // Encendido
+            StateReader[0]='A';
+            
+            return 1;
+        }
+        if(CardReader_Buffer[i]==R_INVALID) {
+            Computer.printf("\n Invalid ");         // Comando Invalido
+            StateReader[0]='N';
+            
+            return 0;
+        }
+        if(CardReader_Buffer[i]==R_ERROR) {
+            Computer.printf("\n Error ");           // Error
+            StateReader[0]='E';
+            
+            return 0;
+        }
+        if(CardReader_Buffer[i]==R_COMAND_ERROR) {
+            Computer.printf("\n Comando error ");    // Error en comando
+            StateReader[0]='C';
+            
+            return 0;
+        }
+    }
+    
+    return 2;
+}
+
+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 Invalido ");     // 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 Comando 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;
+            }
+            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(250);
+    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;
+        }
+        if(CardReader_Buffer[i]==R_INVALID) {
+            Computer.printf("\n Invalido ");     // Comando Invalido
+            StateReader[4]='N';
+            return 0;
+        }
+        if(CardReader_Buffer[i]==R_ERROR) {
+            Computer.printf("\n Error ");       // Error
+            StateReader[4]='E';
+            return 0;
+        }
+        if(CardReader_Buffer[i]==R_COMAND_ERROR) {
+            Computer.printf("\n Comando error ");// Error en comando
+            StateReader[4]='C';
+            return 0;
+        }
+    }
+    return 2;
+}
+
+int 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 Accion");      // Accion ejecutada
+                StateReader[5]='A';
+            }
+            if(CardReader_Buffer[i]==R_INVALID) {
+                Computer.printf("\n Invalido ");     // 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 Comando error ");// Error en comando
+                StateReader[5]='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[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;
+            }
+        }
+        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 Invalido ");             // Comando Invalido
+                StateReader[6]='N';
+                return 0;
+            }
+            if(CardReader_Buffer[i]==R_ERROR) {
+                Computer.printf("\n Error ");               // Error
+                StateReader[6]='E';
+                return 0;
+            }
+            if(CardReader_Buffer[i]==R_COMAND_ERROR) {
+                Computer.printf("\n Error comando ");        // Error en comando
+                StateReader[6]='C';
+                return 0;
+            }
+        }
+    }
+    return 0;
+}
+
+int 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 0;
+            }
+            Computer.putc(CardReader_Buffer[i]);
+            if(CardReader_Buffer[i]=='=') {
+                Computer.printf("Datos leidos ");
+                for(int i=0; i<37; i++) {
+                    Track2[i]=CardReader_Buffer[i+4];
+                }
+                Computer.printf("<%s>\n",Track2);
+                return 1;
+            }
+        }
+    }
+    return 2;
+}
+
+int RetiroTarjeta(uint32_t TiempoFuera)
+{
+    Computer.printf("Retiro tarjeta\n");
+    Inicio=BaseClock.read_ms();
+    while(true) {
+        if(PositionCard()==0) {
+            return 1;
+        } else {
+
+            Computer.printf("Retire tarjeta");
+
+        }
+        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();
+    while(true) {
+        if(PositionCard()==1) {
+            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;
+        }
+    }
+}
+
+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
+    // Se pide al usuario por pantalla la intrduccion de la tarjeta
+                    
+    Computer.printf("Introduzca tarjeta");
+    Computer.printf("debito o credito");
+    sprintf(Track2,"0000000000000000000000000000000000000");
+
+    if(ResetCard()==1) {
+        while(true) {
+            uint8_t RespuestaIngresoTarjeta = IngresoTarjeta(TimeOutEntrada);
+            if(RespuestaIngresoTarjeta==1) {
+
+                Computer.printf("Retire tarjeta");
+
+            }
+            if(RespuestaIngresoTarjeta==0) {
+                wait(3);
+                return USER_FINISH;
+            }
+            if(RespuestaIngresoTarjeta==2) {
+                return USER_FINISH;
+            }
+
+            uint8_t RespuestaReadCard=ReadCard(TimeOutSalida); // Se le la tarjeta al retirarse
+            if(RespuestaReadCard==2) {
+                return USER_FINISH;
+            }
+            
+            uint8_t DataResult=RecibeDataCard();                    // Se corrobora que la informacion de la tajeta es la corre
+            if(DataResult==0) {
+                Computer.printf("Banda magnetica");
+                Computer.printf("ilegible");
+                wait(2);
+                if(RetiroTarjeta(7000)) {
+                    Computer.printf("Introduzca tarjeta");
+                    Computer.printf("debito o credito");
+                } else {
+                    return USER_FINISH;
+                }
+            }
+            if(DataResult==1) {
+                return Salida;
+            }
+            if(DataResult==2) {
+                Computer.printf("Banda magnetica");
+                Computer.printf("ilegible");
+                wait(2);
+                if(RetiroTarjeta(7000)) {
+                    Computer.printf("Introduzca tarjeta");
+                    Computer.printf("debito o credito");
+
+                } else {
+                    return USER_FINISH;
+                }
+            }
+        }
+    } else {
+        Computer.printf("Error");
+        return USER_FINISH;
+    }
+}
+
+int main()
+{
+    BaseClock.start();
+    CardReader.format(8, Serial::None, 1);
+    CardReader.baud(9600);
+    Computer.format(8, Serial::None, 1);
+    Computer.baud(9600);
+    CardReader.attach(&Interrupt_CardReader);
+    while(1) {
+        CardReaderPower=1;
+        Max232=1;
+        Computer.printf("iniciando proceso\n");
+        wait(2);
+        GetCard(USER_TIME,20000,5000);
+        CardReaderPower=0;
+        Max232=0;
+        wait(2);
+    }
+}
\ No newline at end of file
diff -r 000000000000 -r 8e949d38885c mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Tue Jun 04 18:01:55 2019 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/5aab5a7997ee
\ No newline at end of file