Willie Solano
/
CardReader_Funcional
CardReader_Funcional
Revision 0:8e949d38885c, committed 2019-06-04
- 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