CardReader
Revision 0:e5dbf1e75384, committed 2019-06-04
- Comitter:
- williequesada
- Date:
- Tue Jun 04 18:05:14 2019 +0000
- Commit message:
- pablo
Changed in this revision
CardReader.cpp | Show annotated file Show diff for this revision Revisions of this file |
CardReader.h | Show annotated file Show diff for this revision Revisions of this file |
diff -r 000000000000 -r e5dbf1e75384 CardReader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CardReader.cpp Tue Jun 04 18:05:14 2019 +0000 @@ -0,0 +1,207 @@ +#include "CardReader.h" +#include "mbed.h" +#include "stdio.h" + +#define START 0x30 +#define COMMAND 0x31 +#define ERROR 0x32 +#define INVALID 0x33 +#define NOTHING 0x34 + + +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 StateReader[7]= {'0','0','0','0','0','0','0'}; +char CardReader_Buffer[255]; +int CardReader_Counter=0; +unsigned long Inicio, Fin, Transcurrido; +Timer TimeOutClock; + +READER::READER(PinName TX, PinName RX) : CardReader(TX,RX) +{ + CardReader.attach(this,&READER::Interrupt); +} +void READER::Interrupt() +{ + CardReader_Buffer[CardReader_Counter]=CardReader.getc(); + CardReader_Counter++; +} + +uint8_t READER::Reset() +{ + CardReader_Counter=0; + StateReader[0]='S'; + 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(3000); + for(int i=0; i<=CardReader_Counter; i++) { + if(CardReader_Buffer[i]==R_START) { + //Computer.printf("\n START"); // Encendido + StateReader[0]='A'; + return START; + } + if(CardReader_Buffer[i]==R_INVALID) { + //Computer.printf("\n INVALID "); // Comando Invalido + StateReader[1]='N'; + return INVALID; + } + if(CardReader_Buffer[i]==R_ERROR) { + //Computer.printf("\n ERROR "); // Error + StateReader[1]='E'; + return ERROR; + } + if(CardReader_Buffer[i]==R_COMAND_ERROR) { + //Computer.printf("\n COMAND ERROR "); // Error en comando + StateReader[1]='C'; + return COMMAND; + } + } + return NOTHING; +}; + +uint8_t READER::Detection() +{ + 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"); + 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=TimeOutClock.read_ms(); + while(CardReader_Counter==0) { // Esperando introduccion de tarjeta + Fin=TimeOutClock.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>40000) { + //Computer.printf("\n Tiempo de respuesta"); + 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++) { + 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'; + } + } + } + return 0x00; +}; +uint8_t READER::Position() +{ + return 0x00; +}; +uint8_t READER::Read() +{ + return 0x00; +}; +char * READER::Data() +{ + return 0x00; +}; +
diff -r 000000000000 -r e5dbf1e75384 CardReader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CardReader.h Tue Jun 04 18:05:14 2019 +0000 @@ -0,0 +1,25 @@ + + +#ifndef MBED_READER_H +#define MBED_READER_H + +#include "mbed.h" + +class READER { +public: + READER(PinName TX, PinName RX); + + void Interrupt(); + uint8_t Reset(); + uint8_t Detection(); + uint8_t Position(); + uint8_t Read(); + char *Data(); + +private: + Serial CardReader; +}; + +#endif + + \ No newline at end of file