CardReader

Committer:
williequesada
Date:
Tue Jun 04 18:05:14 2019 +0000
Revision:
0:e5dbf1e75384
pablo

Who changed what in which revision?

UserRevisionLine numberNew contents of line
williequesada 0:e5dbf1e75384 1 #include "CardReader.h"
williequesada 0:e5dbf1e75384 2 #include "mbed.h"
williequesada 0:e5dbf1e75384 3 #include "stdio.h"
williequesada 0:e5dbf1e75384 4
williequesada 0:e5dbf1e75384 5 #define START 0x30
williequesada 0:e5dbf1e75384 6 #define COMMAND 0x31
williequesada 0:e5dbf1e75384 7 #define ERROR 0x32
williequesada 0:e5dbf1e75384 8 #define INVALID 0x33
williequesada 0:e5dbf1e75384 9 #define NOTHING 0x34
williequesada 0:e5dbf1e75384 10
williequesada 0:e5dbf1e75384 11
williequesada 0:e5dbf1e75384 12 const char SOH=1;
williequesada 0:e5dbf1e75384 13 const char EOT=4;
williequesada 0:e5dbf1e75384 14 const char ESP=33;
williequesada 0:e5dbf1e75384 15 const char ADDR=0;
williequesada 0:e5dbf1e75384 16 const char LEN=0;
williequesada 0:e5dbf1e75384 17 const char CARD_POSITION='8';
williequesada 0:e5dbf1e75384 18 const char CARD_LOCK='{';
williequesada 0:e5dbf1e75384 19 const char CARD_UNLOCK='}';
williequesada 0:e5dbf1e75384 20 const char DEV_STATUS='$';
williequesada 0:e5dbf1e75384 21 const char DEV_RESET=127;
williequesada 0:e5dbf1e75384 22 const char ARM_MODE='P';
williequesada 0:e5dbf1e75384 23 const char ARM_DEBUG='p';
williequesada 0:e5dbf1e75384 24 const char ARM_ABORT=27;
williequesada 0:e5dbf1e75384 25 const char SIG_START='?';
williequesada 0:e5dbf1e75384 26 const char FCT_READ='R';
williequesada 0:e5dbf1e75384 27 const char MAG_CUSTOM_T1='U';
williequesada 0:e5dbf1e75384 28 const char MAG_CUSTOM_T2='V';
williequesada 0:e5dbf1e75384 29 const char MAG_CUSTOM_T3='W';
williequesada 0:e5dbf1e75384 30 const char MAG_ISO_T1='Q';
williequesada 0:e5dbf1e75384 31 const char MAG_ISO_T2='R';
williequesada 0:e5dbf1e75384 32 const char MAG_ISO_T3='S';
williequesada 0:e5dbf1e75384 33 const char MAG_CUSTOM_F='4';
williequesada 0:e5dbf1e75384 34 const char BBCA='=';
williequesada 0:e5dbf1e75384 35 const char BBCB='~';
williequesada 0:e5dbf1e75384 36 const char BBCC='x';
williequesada 0:e5dbf1e75384 37 const char BBCD='!';
williequesada 0:e5dbf1e75384 38 const char BBCE='U';
williequesada 0:e5dbf1e75384 39 const char BBCF='u';
williequesada 0:e5dbf1e75384 40 const char BBCG=30;
williequesada 0:e5dbf1e75384 41 const char BBCH='d';
williequesada 0:e5dbf1e75384 42 const char BBCI='z';
williequesada 0:e5dbf1e75384 43 const char BBCJ='T';
williequesada 0:e5dbf1e75384 44 const char BBCK='W';
williequesada 0:e5dbf1e75384 45 const char BBCL='V';
williequesada 0:e5dbf1e75384 46 const char BBCM=10;
williequesada 0:e5dbf1e75384 47 const char R_ACTION='^';
williequesada 0:e5dbf1e75384 48 const char R_ERROR='*';
williequesada 0:e5dbf1e75384 49 const char R_INVALID='!';
williequesada 0:e5dbf1e75384 50 const char R_NO_DATA='+';
williequesada 0:e5dbf1e75384 51 const char R_COMAND_ERROR='?';
williequesada 0:e5dbf1e75384 52 const char R_START=':';
williequesada 0:e5dbf1e75384 53 const char R_POSITION1='q';
williequesada 0:e5dbf1e75384 54 const char R_POSITION2='s';
williequesada 0:e5dbf1e75384 55 const char R_NO_MAG_CARD='>';
williequesada 0:e5dbf1e75384 56 const char R_MAG_DETECT_ON='(';
williequesada 0:e5dbf1e75384 57 const char R_MAG_DETECT_OFF=')';
williequesada 0:e5dbf1e75384 58
williequesada 0:e5dbf1e75384 59 char StateReader[7]= {'0','0','0','0','0','0','0'};
williequesada 0:e5dbf1e75384 60 char CardReader_Buffer[255];
williequesada 0:e5dbf1e75384 61 int CardReader_Counter=0;
williequesada 0:e5dbf1e75384 62 unsigned long Inicio, Fin, Transcurrido;
williequesada 0:e5dbf1e75384 63 Timer TimeOutClock;
williequesada 0:e5dbf1e75384 64
williequesada 0:e5dbf1e75384 65 READER::READER(PinName TX, PinName RX) : CardReader(TX,RX)
williequesada 0:e5dbf1e75384 66 {
williequesada 0:e5dbf1e75384 67 CardReader.attach(this,&READER::Interrupt);
williequesada 0:e5dbf1e75384 68 }
williequesada 0:e5dbf1e75384 69 void READER::Interrupt()
williequesada 0:e5dbf1e75384 70 {
williequesada 0:e5dbf1e75384 71 CardReader_Buffer[CardReader_Counter]=CardReader.getc();
williequesada 0:e5dbf1e75384 72 CardReader_Counter++;
williequesada 0:e5dbf1e75384 73 }
williequesada 0:e5dbf1e75384 74
williequesada 0:e5dbf1e75384 75 uint8_t READER::Reset()
williequesada 0:e5dbf1e75384 76 {
williequesada 0:e5dbf1e75384 77 CardReader_Counter=0;
williequesada 0:e5dbf1e75384 78 StateReader[0]='S';
williequesada 0:e5dbf1e75384 79 CardReader.putc(SOH); // 00000001
williequesada 0:e5dbf1e75384 80 CardReader.putc(ADDR); // 00000000
williequesada 0:e5dbf1e75384 81 CardReader.putc(LEN); // 00000000
williequesada 0:e5dbf1e75384 82 CardReader.putc(LEN); // 00000000
williequesada 0:e5dbf1e75384 83 CardReader.putc(DEV_RESET); // 01111111
williequesada 0:e5dbf1e75384 84 CardReader.putc(EOT); // 00000100
williequesada 0:e5dbf1e75384 85 CardReader.putc(BBCI); // 01111010
williequesada 0:e5dbf1e75384 86 wait_ms(3000);
williequesada 0:e5dbf1e75384 87 for(int i=0; i<=CardReader_Counter; i++) {
williequesada 0:e5dbf1e75384 88 if(CardReader_Buffer[i]==R_START) {
williequesada 0:e5dbf1e75384 89 //Computer.printf("\n START"); // Encendido
williequesada 0:e5dbf1e75384 90 StateReader[0]='A';
williequesada 0:e5dbf1e75384 91 return START;
williequesada 0:e5dbf1e75384 92 }
williequesada 0:e5dbf1e75384 93 if(CardReader_Buffer[i]==R_INVALID) {
williequesada 0:e5dbf1e75384 94 //Computer.printf("\n INVALID "); // Comando Invalido
williequesada 0:e5dbf1e75384 95 StateReader[1]='N';
williequesada 0:e5dbf1e75384 96 return INVALID;
williequesada 0:e5dbf1e75384 97 }
williequesada 0:e5dbf1e75384 98 if(CardReader_Buffer[i]==R_ERROR) {
williequesada 0:e5dbf1e75384 99 //Computer.printf("\n ERROR "); // Error
williequesada 0:e5dbf1e75384 100 StateReader[1]='E';
williequesada 0:e5dbf1e75384 101 return ERROR;
williequesada 0:e5dbf1e75384 102 }
williequesada 0:e5dbf1e75384 103 if(CardReader_Buffer[i]==R_COMAND_ERROR) {
williequesada 0:e5dbf1e75384 104 //Computer.printf("\n COMAND ERROR "); // Error en comando
williequesada 0:e5dbf1e75384 105 StateReader[1]='C';
williequesada 0:e5dbf1e75384 106 return COMMAND;
williequesada 0:e5dbf1e75384 107 }
williequesada 0:e5dbf1e75384 108 }
williequesada 0:e5dbf1e75384 109 return NOTHING;
williequesada 0:e5dbf1e75384 110 };
williequesada 0:e5dbf1e75384 111
williequesada 0:e5dbf1e75384 112 uint8_t READER::Detection()
williequesada 0:e5dbf1e75384 113 {
williequesada 0:e5dbf1e75384 114 CardReader_Counter=0;
williequesada 0:e5dbf1e75384 115 StateReader[1]='S';
williequesada 0:e5dbf1e75384 116 StateReader[2]='S';
williequesada 0:e5dbf1e75384 117 StateReader[3]='S';
williequesada 0:e5dbf1e75384 118 if(StateReader[0]=='A') { // Se envia el comando Arm Debug
williequesada 0:e5dbf1e75384 119 //Computer.printf("\n Introducir Tarjeta");
williequesada 0:e5dbf1e75384 120 CardReader.putc(SOH);
williequesada 0:e5dbf1e75384 121 CardReader.putc(ADDR);
williequesada 0:e5dbf1e75384 122 CardReader.putc(LEN);
williequesada 0:e5dbf1e75384 123 CardReader.putc(LEN);
williequesada 0:e5dbf1e75384 124 CardReader.putc(ARM_DEBUG);
williequesada 0:e5dbf1e75384 125 CardReader.putc(EOT);
williequesada 0:e5dbf1e75384 126 CardReader.putc(BBCF);
williequesada 0:e5dbf1e75384 127 wait_ms(500);
williequesada 0:e5dbf1e75384 128 for(int i=0; i<=CardReader_Counter; i++) {
williequesada 0:e5dbf1e75384 129 if(CardReader_Buffer[i]==R_ACTION) {
williequesada 0:e5dbf1e75384 130 //Computer.printf("\n ACTION "); // Accion ejecutada
williequesada 0:e5dbf1e75384 131 StateReader[1]='A';
williequesada 0:e5dbf1e75384 132 }
williequesada 0:e5dbf1e75384 133 if(CardReader_Buffer[i]==R_INVALID) {
williequesada 0:e5dbf1e75384 134 //Computer.printf("\n INVALID "); // Comando Invalido
williequesada 0:e5dbf1e75384 135 StateReader[1]='N';
williequesada 0:e5dbf1e75384 136 }
williequesada 0:e5dbf1e75384 137 if(CardReader_Buffer[i]==R_ERROR) {
williequesada 0:e5dbf1e75384 138 //Computer.printf("\n ERROR "); // Error
williequesada 0:e5dbf1e75384 139 StateReader[1]='E';
williequesada 0:e5dbf1e75384 140 }
williequesada 0:e5dbf1e75384 141 if(CardReader_Buffer[i]==R_COMAND_ERROR) {
williequesada 0:e5dbf1e75384 142 //Computer.printf("\n COMAND ERROR ");// Error en comando
williequesada 0:e5dbf1e75384 143 StateReader[1]='C';
williequesada 0:e5dbf1e75384 144 }
williequesada 0:e5dbf1e75384 145 }
williequesada 0:e5dbf1e75384 146 CardReader_Counter=0;
williequesada 0:e5dbf1e75384 147
williequesada 0:e5dbf1e75384 148 Inicio=TimeOutClock.read_ms();
williequesada 0:e5dbf1e75384 149 while(CardReader_Counter==0) { // Esperando introduccion de tarjeta
williequesada 0:e5dbf1e75384 150 Fin=TimeOutClock.read_ms();
williequesada 0:e5dbf1e75384 151 Transcurrido=Fin-Inicio;
williequesada 0:e5dbf1e75384 152 if(StateReader[1]=='C'||StateReader[1]=='E'||StateReader[1]=='N') {
williequesada 0:e5dbf1e75384 153 //Computer.printf("\n Error en comando");
williequesada 0:e5dbf1e75384 154 break;
williequesada 0:e5dbf1e75384 155 }
williequesada 0:e5dbf1e75384 156 if(StateReader[1]=='S') {
williequesada 0:e5dbf1e75384 157 //Computer.printf("\n Sin Respuesta");
williequesada 0:e5dbf1e75384 158 break;
williequesada 0:e5dbf1e75384 159 }
williequesada 0:e5dbf1e75384 160 if(Transcurrido>40000) {
williequesada 0:e5dbf1e75384 161 //Computer.printf("\n Tiempo de respuesta");
williequesada 0:e5dbf1e75384 162 CardReader.putc(SOH);
williequesada 0:e5dbf1e75384 163 CardReader.putc(ADDR);
williequesada 0:e5dbf1e75384 164 CardReader.putc(LEN);
williequesada 0:e5dbf1e75384 165 CardReader.putc(LEN);
williequesada 0:e5dbf1e75384 166 CardReader.putc(ARM_ABORT);
williequesada 0:e5dbf1e75384 167 CardReader.putc(EOT);
williequesada 0:e5dbf1e75384 168 CardReader.putc(BBCG);
williequesada 0:e5dbf1e75384 169 break;
williequesada 0:e5dbf1e75384 170 }
williequesada 0:e5dbf1e75384 171 }
williequesada 0:e5dbf1e75384 172 wait_ms(1000);
williequesada 0:e5dbf1e75384 173 for(int i=0; i<=CardReader_Counter; i++) {
williequesada 0:e5dbf1e75384 174 if(CardReader_Buffer[i]==R_NO_MAG_CARD) {
williequesada 0:e5dbf1e75384 175 //Computer.printf("\n Deteccion Nula "); // No se detecta banda magnetica
williequesada 0:e5dbf1e75384 176 StateReader[2]='N';
williequesada 0:e5dbf1e75384 177 StateReader[3]='N';
williequesada 0:e5dbf1e75384 178 }
williequesada 0:e5dbf1e75384 179 if(CardReader_Buffer[i]==R_MAG_DETECT_ON) {
williequesada 0:e5dbf1e75384 180 //Computer.printf("\n Deteccion On "); // Se inicia verificacion de banda
williequesada 0:e5dbf1e75384 181 StateReader[2]='A';
williequesada 0:e5dbf1e75384 182 }
williequesada 0:e5dbf1e75384 183 if(CardReader_Buffer[i]==R_MAG_DETECT_OFF) {
williequesada 0:e5dbf1e75384 184 //Computer.printf("\n Deteccion Off "); // Se termina verificacion de banda
williequesada 0:e5dbf1e75384 185 StateReader[3]='A';
williequesada 0:e5dbf1e75384 186 }
williequesada 0:e5dbf1e75384 187 if(CardReader_Buffer[i]==R_ACTION) {
williequesada 0:e5dbf1e75384 188 //Computer.printf("\n Action Arm Abort "); // Accion ejecutada
williequesada 0:e5dbf1e75384 189 StateReader[1]='T';
williequesada 0:e5dbf1e75384 190 }
williequesada 0:e5dbf1e75384 191 }
williequesada 0:e5dbf1e75384 192 }
williequesada 0:e5dbf1e75384 193 return 0x00;
williequesada 0:e5dbf1e75384 194 };
williequesada 0:e5dbf1e75384 195 uint8_t READER::Position()
williequesada 0:e5dbf1e75384 196 {
williequesada 0:e5dbf1e75384 197 return 0x00;
williequesada 0:e5dbf1e75384 198 };
williequesada 0:e5dbf1e75384 199 uint8_t READER::Read()
williequesada 0:e5dbf1e75384 200 {
williequesada 0:e5dbf1e75384 201 return 0x00;
williequesada 0:e5dbf1e75384 202 };
williequesada 0:e5dbf1e75384 203 char * READER::Data()
williequesada 0:e5dbf1e75384 204 {
williequesada 0:e5dbf1e75384 205 return 0x00;
williequesada 0:e5dbf1e75384 206 };
williequesada 0:e5dbf1e75384 207