CardReader_Funcional

Dependencies:   mbed

Committer:
williequesada
Date:
Tue Jun 04 18:01:55 2019 +0000
Revision:
0:8e949d38885c
pablo

Who changed what in which revision?

UserRevisionLine numberNew contents of line
williequesada 0:8e949d38885c 1 #include "mbed.h"
williequesada 0:8e949d38885c 2
williequesada 0:8e949d38885c 3 #define COMMAND_ON 0X70
williequesada 0:8e949d38885c 4 #define COMMAND_INIT 0X71
williequesada 0:8e949d38885c 5 #define COMMAND_GPRS 0X72
williequesada 0:8e949d38885c 6 #define COMMAND_DATA 0X73
williequesada 0:8e949d38885c 7 #define COMMAND_POST 0X74
williequesada 0:8e949d38885c 8 #define COMMAND_ANSWER 0X75
williequesada 0:8e949d38885c 9 #define COMMAND_SIGNAL 0X76
williequesada 0:8e949d38885c 10 #define COMMAND_CONNECT 0X77
williequesada 0:8e949d38885c 11 #define COMMAND_OFF 0X78
williequesada 0:8e949d38885c 12 #define HOSTING_STEP1 0x79
williequesada 0:8e949d38885c 13 #define HOSTING_STEP2 0x7A
williequesada 0:8e949d38885c 14 #define HOSTING_STEP3 0x7B
williequesada 0:8e949d38885c 15 #define HOSTING_STEP4 0x7C
williequesada 0:8e949d38885c 16 #define HOSTING_STEP5 0x7D
williequesada 0:8e949d38885c 17 #define HOSTING_STEP6 0x7E
williequesada 0:8e949d38885c 18 #define HOSTING_STEP7 0x7F
williequesada 0:8e949d38885c 19 #define HOSTING_STEP8 0x80
williequesada 0:8e949d38885c 20 #define HOSTING_STEP9 0x81
williequesada 0:8e949d38885c 21 #define HOSTING_STEP10 0x82
williequesada 0:8e949d38885c 22 #define HOSTING_STEP11 0x83
williequesada 0:8e949d38885c 23 #define HOSTING_OFF 0x84
williequesada 0:8e949d38885c 24 #define NEXT_STEP 0x85
williequesada 0:8e949d38885c 25 #define NEXT_SLEEP 0x86
williequesada 0:8e949d38885c 26 #define COMMAND_END 0X88
williequesada 0:8e949d38885c 27
williequesada 0:8e949d38885c 28 #define USER_INIT 0xA0
williequesada 0:8e949d38885c 29 #define USER_PLACE 0xA1
williequesada 0:8e949d38885c 30 #define USER_CARD 0xA2
williequesada 0:8e949d38885c 31 #define USER_TIME 0xA3
williequesada 0:8e949d38885c 32 #define USER_DATA 0xA4
williequesada 0:8e949d38885c 33 #define USER_PRINT 0xA5
williequesada 0:8e949d38885c 34 #define USER_TICKET 0xA6
williequesada 0:8e949d38885c 35 #define USER_FINISH 0xA7
williequesada 0:8e949d38885c 36 #define USER_POST 0xA8
williequesada 0:8e949d38885c 37 #define USER_ANSWER 0xA9
williequesada 0:8e949d38885c 38 #define USER_INIT2 0xAA
williequesada 0:8e949d38885c 39 #define USER_INIT3 0xB0
williequesada 0:8e949d38885c 40 #define USER_INIT4 0xB1
williequesada 0:8e949d38885c 41 #define USER_CARD2 0xB2
williequesada 0:8e949d38885c 42 #define USER_INIT5 0xB3
williequesada 0:8e949d38885c 43 #define USER_CARD3 0xB4
williequesada 0:8e949d38885c 44 // Conector ZHR-6 de JST http://www.jst.com/
williequesada 0:8e949d38885c 45 // _ _ _ _ _ _
williequesada 0:8e949d38885c 46 // ! ! ! ! ! ! ! 1->CTS 2->TXD 3->DTR
williequesada 0:8e949d38885c 47 // 6 5 4 3 2 1 4->RXD 5->GND 6->PWR
williequesada 0:8e949d38885c 48
williequesada 0:8e949d38885c 49 Serial Computer(USBTX, USBRX); // tx, rx
williequesada 0:8e949d38885c 50 Serial CardReader(PC_12,PD_2,9600);
williequesada 0:8e949d38885c 51
williequesada 0:8e949d38885c 52 const char SOH=1;
williequesada 0:8e949d38885c 53 const char EOT=4;
williequesada 0:8e949d38885c 54 const char ESP=33;
williequesada 0:8e949d38885c 55 const char ADDR=0;
williequesada 0:8e949d38885c 56 const char LEN=0;
williequesada 0:8e949d38885c 57 const char CARD_POSITION='8';
williequesada 0:8e949d38885c 58 const char CARD_LOCK='{';
williequesada 0:8e949d38885c 59 const char CARD_UNLOCK='}';
williequesada 0:8e949d38885c 60 const char DEV_STATUS='$';
williequesada 0:8e949d38885c 61 const char DEV_RESET=127;
williequesada 0:8e949d38885c 62 const char ARM_MODE='P';
williequesada 0:8e949d38885c 63 const char ARM_DEBUG='p';
williequesada 0:8e949d38885c 64 const char ARM_ABORT=27;
williequesada 0:8e949d38885c 65 const char SIG_START='?';
williequesada 0:8e949d38885c 66 const char FCT_READ='R';
williequesada 0:8e949d38885c 67 const char MAG_CUSTOM_T1='U';
williequesada 0:8e949d38885c 68 const char MAG_CUSTOM_T2='V';
williequesada 0:8e949d38885c 69 const char MAG_CUSTOM_T3='W';
williequesada 0:8e949d38885c 70 const char MAG_ISO_T1='Q';
williequesada 0:8e949d38885c 71 const char MAG_ISO_T2='R';
williequesada 0:8e949d38885c 72 const char MAG_ISO_T3='S';
williequesada 0:8e949d38885c 73 const char MAG_CUSTOM_F='4';
williequesada 0:8e949d38885c 74 const char BBCA='=';
williequesada 0:8e949d38885c 75 const char BBCB='~';
williequesada 0:8e949d38885c 76 const char BBCC='x';
williequesada 0:8e949d38885c 77 const char BBCD='!';
williequesada 0:8e949d38885c 78 const char BBCE='U';
williequesada 0:8e949d38885c 79 const char BBCF='u';
williequesada 0:8e949d38885c 80 const char BBCG=30;
williequesada 0:8e949d38885c 81 const char BBCH='d';
williequesada 0:8e949d38885c 82 const char BBCI='z';
williequesada 0:8e949d38885c 83 const char BBCJ='T';
williequesada 0:8e949d38885c 84 const char BBCK='W';
williequesada 0:8e949d38885c 85 const char BBCL='V';
williequesada 0:8e949d38885c 86 const char BBCM=10;
williequesada 0:8e949d38885c 87 const char R_ACTION='^';
williequesada 0:8e949d38885c 88 const char R_ERROR='*';
williequesada 0:8e949d38885c 89 const char R_INVALID='!';
williequesada 0:8e949d38885c 90 const char R_NO_DATA='+';
williequesada 0:8e949d38885c 91 const char R_COMAND_ERROR='?';
williequesada 0:8e949d38885c 92 const char R_START=':';
williequesada 0:8e949d38885c 93 const char R_POSITION1='q';
williequesada 0:8e949d38885c 94 const char R_POSITION2='s';
williequesada 0:8e949d38885c 95 const char R_NO_MAG_CARD='>';
williequesada 0:8e949d38885c 96 const char R_MAG_DETECT_ON='(';
williequesada 0:8e949d38885c 97 const char R_MAG_DETECT_OFF=')';
williequesada 0:8e949d38885c 98 char Track2[38]="0000000000000000000000000000000000000";
williequesada 0:8e949d38885c 99
williequesada 0:8e949d38885c 100 DigitalOut CardReaderPower(PF_3);//
williequesada 0:8e949d38885c 101 DigitalOut Max232(PC_8);
williequesada 0:8e949d38885c 102
williequesada 0:8e949d38885c 103
williequesada 0:8e949d38885c 104 char StateReader[7]= {'0','0','0','0','0','0','0'};
williequesada 0:8e949d38885c 105 char CardReader_Buffer[255];
williequesada 0:8e949d38885c 106 int CardReader_Counter=0;
williequesada 0:8e949d38885c 107 char Comando=' ';
williequesada 0:8e949d38885c 108 unsigned long Inicio, Fin, Transcurrido;
williequesada 0:8e949d38885c 109 Timer BaseClock;
williequesada 0:8e949d38885c 110
williequesada 0:8e949d38885c 111
williequesada 0:8e949d38885c 112
williequesada 0:8e949d38885c 113 void Interrupt_CardReader()
williequesada 0:8e949d38885c 114 {
williequesada 0:8e949d38885c 115 CardReader_Buffer[CardReader_Counter]=CardReader.getc();
williequesada 0:8e949d38885c 116 CardReader_Counter++;
williequesada 0:8e949d38885c 117 }
williequesada 0:8e949d38885c 118
williequesada 0:8e949d38885c 119
williequesada 0:8e949d38885c 120
williequesada 0:8e949d38885c 121 int ResetCard()
williequesada 0:8e949d38885c 122 {
williequesada 0:8e949d38885c 123 CardReader_Counter=0;
williequesada 0:8e949d38885c 124 StateReader[0]='S';
williequesada 0:8e949d38885c 125 Computer.printf("\n Reset card reader");
williequesada 0:8e949d38885c 126 if(CardReader.writeable()) {
williequesada 0:8e949d38885c 127 CardReader.putc(SOH); // 00000001
williequesada 0:8e949d38885c 128 CardReader.putc(ADDR); // 00000000
williequesada 0:8e949d38885c 129 CardReader.putc(LEN); // 00000000
williequesada 0:8e949d38885c 130 CardReader.putc(LEN); // 00000000
williequesada 0:8e949d38885c 131 CardReader.putc(DEV_RESET); // 01111111
williequesada 0:8e949d38885c 132 CardReader.putc(EOT); // 00000100
williequesada 0:8e949d38885c 133 CardReader.putc(BBCI); // 01111010
williequesada 0:8e949d38885c 134 }
williequesada 0:8e949d38885c 135 wait_ms(2000);
williequesada 0:8e949d38885c 136 for(int i=0; i<=CardReader_Counter; i++) {
williequesada 0:8e949d38885c 137 if(CardReader_Buffer[i]==R_START) {
williequesada 0:8e949d38885c 138 Computer.printf("\n Start\n"); // Encendido
williequesada 0:8e949d38885c 139 StateReader[0]='A';
williequesada 0:8e949d38885c 140
williequesada 0:8e949d38885c 141 return 1;
williequesada 0:8e949d38885c 142 }
williequesada 0:8e949d38885c 143 if(CardReader_Buffer[i]==R_INVALID) {
williequesada 0:8e949d38885c 144 Computer.printf("\n Invalid "); // Comando Invalido
williequesada 0:8e949d38885c 145 StateReader[0]='N';
williequesada 0:8e949d38885c 146
williequesada 0:8e949d38885c 147 return 0;
williequesada 0:8e949d38885c 148 }
williequesada 0:8e949d38885c 149 if(CardReader_Buffer[i]==R_ERROR) {
williequesada 0:8e949d38885c 150 Computer.printf("\n Error "); // Error
williequesada 0:8e949d38885c 151 StateReader[0]='E';
williequesada 0:8e949d38885c 152
williequesada 0:8e949d38885c 153 return 0;
williequesada 0:8e949d38885c 154 }
williequesada 0:8e949d38885c 155 if(CardReader_Buffer[i]==R_COMAND_ERROR) {
williequesada 0:8e949d38885c 156 Computer.printf("\n Comando error "); // Error en comando
williequesada 0:8e949d38885c 157 StateReader[0]='C';
williequesada 0:8e949d38885c 158
williequesada 0:8e949d38885c 159 return 0;
williequesada 0:8e949d38885c 160 }
williequesada 0:8e949d38885c 161 }
williequesada 0:8e949d38885c 162
williequesada 0:8e949d38885c 163 return 2;
williequesada 0:8e949d38885c 164 }
williequesada 0:8e949d38885c 165
williequesada 0:8e949d38885c 166 void DetectionCard(uint32_t TimeOut)
williequesada 0:8e949d38885c 167 {
williequesada 0:8e949d38885c 168 CardReader_Counter=0;
williequesada 0:8e949d38885c 169 StateReader[1]='S';
williequesada 0:8e949d38885c 170 StateReader[2]='S';
williequesada 0:8e949d38885c 171 StateReader[3]='S';
williequesada 0:8e949d38885c 172 if(StateReader[0]=='A') { // Se envia el comando Arm Debug
williequesada 0:8e949d38885c 173 Computer.printf("\n Introducir tarjeta");
williequesada 0:8e949d38885c 174 if(CardReader.writeable()) {
williequesada 0:8e949d38885c 175 CardReader.putc(SOH);
williequesada 0:8e949d38885c 176 CardReader.putc(ADDR);
williequesada 0:8e949d38885c 177 CardReader.putc(LEN);
williequesada 0:8e949d38885c 178 CardReader.putc(LEN);
williequesada 0:8e949d38885c 179 CardReader.putc(ARM_DEBUG);
williequesada 0:8e949d38885c 180 CardReader.putc(EOT);
williequesada 0:8e949d38885c 181 CardReader.putc(BBCF);
williequesada 0:8e949d38885c 182 }
williequesada 0:8e949d38885c 183 wait_ms(500);
williequesada 0:8e949d38885c 184 for(int i=0; i<=CardReader_Counter; i++) {
williequesada 0:8e949d38885c 185 if(CardReader_Buffer[i]==R_ACTION) {
williequesada 0:8e949d38885c 186 Computer.printf("\n ACTION "); // Accion ejecutada
williequesada 0:8e949d38885c 187 StateReader[1]='A';
williequesada 0:8e949d38885c 188
williequesada 0:8e949d38885c 189 }
williequesada 0:8e949d38885c 190 if(CardReader_Buffer[i]==R_INVALID) {
williequesada 0:8e949d38885c 191 Computer.printf("\n Invalido "); // Comando Invalido
williequesada 0:8e949d38885c 192 StateReader[1]='N';
williequesada 0:8e949d38885c 193
williequesada 0:8e949d38885c 194 }
williequesada 0:8e949d38885c 195 if(CardReader_Buffer[i]==R_ERROR) {
williequesada 0:8e949d38885c 196 Computer.printf("\n Error "); // Error
williequesada 0:8e949d38885c 197 StateReader[1]='E';
williequesada 0:8e949d38885c 198
williequesada 0:8e949d38885c 199 }
williequesada 0:8e949d38885c 200 if(CardReader_Buffer[i]==R_COMAND_ERROR) {
williequesada 0:8e949d38885c 201 Computer.printf("\n Comando error ");// Error en comando
williequesada 0:8e949d38885c 202 StateReader[1]='C';
williequesada 0:8e949d38885c 203
williequesada 0:8e949d38885c 204 }
williequesada 0:8e949d38885c 205 }
williequesada 0:8e949d38885c 206 CardReader_Counter=0;
williequesada 0:8e949d38885c 207
williequesada 0:8e949d38885c 208 Inicio=BaseClock.read_ms();
williequesada 0:8e949d38885c 209 while(CardReader_Counter==0) { // Esperando introduccion de tarjeta
williequesada 0:8e949d38885c 210 Fin=BaseClock.read_ms();
williequesada 0:8e949d38885c 211 Transcurrido=Fin-Inicio;
williequesada 0:8e949d38885c 212 if(StateReader[1]=='C'||StateReader[1]=='E'||StateReader[1]=='N') {
williequesada 0:8e949d38885c 213 Computer.printf("\n Error en comando");
williequesada 0:8e949d38885c 214 break;
williequesada 0:8e949d38885c 215 }
williequesada 0:8e949d38885c 216 if(StateReader[1]=='S') {
williequesada 0:8e949d38885c 217 Computer.printf("\n Sin respuesta");
williequesada 0:8e949d38885c 218 break;
williequesada 0:8e949d38885c 219 }
williequesada 0:8e949d38885c 220 if(Transcurrido>TimeOut) {
williequesada 0:8e949d38885c 221 Computer.printf("\n Tiempo de respuesta");
williequesada 0:8e949d38885c 222 if(CardReader.writeable()) {
williequesada 0:8e949d38885c 223 CardReader.putc(SOH);
williequesada 0:8e949d38885c 224 CardReader.putc(ADDR);
williequesada 0:8e949d38885c 225 CardReader.putc(LEN);
williequesada 0:8e949d38885c 226 CardReader.putc(LEN);
williequesada 0:8e949d38885c 227 CardReader.putc(ARM_ABORT);
williequesada 0:8e949d38885c 228 CardReader.putc(EOT);
williequesada 0:8e949d38885c 229 CardReader.putc(BBCG);
williequesada 0:8e949d38885c 230 }
williequesada 0:8e949d38885c 231 break;
williequesada 0:8e949d38885c 232 }
williequesada 0:8e949d38885c 233 }
williequesada 0:8e949d38885c 234 wait_ms(1000);
williequesada 0:8e949d38885c 235 for(int i=0; i<=CardReader_Counter; i++) {
williequesada 0:8e949d38885c 236 Computer.printf("%c",CardReader_Buffer[i]);
williequesada 0:8e949d38885c 237 if(CardReader_Buffer[i]==R_NO_MAG_CARD) {
williequesada 0:8e949d38885c 238 Computer.printf("\n Deteccion nula "); // No se detecta banda magnetica
williequesada 0:8e949d38885c 239 StateReader[2]='N';
williequesada 0:8e949d38885c 240 StateReader[3]='N';
williequesada 0:8e949d38885c 241 }
williequesada 0:8e949d38885c 242 if(CardReader_Buffer[i]==R_MAG_DETECT_ON) {
williequesada 0:8e949d38885c 243 Computer.printf("\n Deteccion on "); // Se inicia verificacion de banda
williequesada 0:8e949d38885c 244 StateReader[2]='A';
williequesada 0:8e949d38885c 245 }
williequesada 0:8e949d38885c 246 if(CardReader_Buffer[i]==R_MAG_DETECT_OFF) {
williequesada 0:8e949d38885c 247 Computer.printf("\n Deteccion off "); // Se termina verificacion de banda
williequesada 0:8e949d38885c 248 StateReader[3]='A';
williequesada 0:8e949d38885c 249 }
williequesada 0:8e949d38885c 250 if(CardReader_Buffer[i]==R_ACTION) {
williequesada 0:8e949d38885c 251 Computer.printf("\n Action arm abort "); // Accion ejecutada
williequesada 0:8e949d38885c 252 StateReader[1]='T';
williequesada 0:8e949d38885c 253 }
williequesada 0:8e949d38885c 254 }
williequesada 0:8e949d38885c 255 }
williequesada 0:8e949d38885c 256 }
williequesada 0:8e949d38885c 257
williequesada 0:8e949d38885c 258 int PositionCard()
williequesada 0:8e949d38885c 259 {
williequesada 0:8e949d38885c 260 CardReader_Counter=0;
williequesada 0:8e949d38885c 261 StateReader[4]='S';
williequesada 0:8e949d38885c 262 Computer.printf("\n Detectando tarjeta");
williequesada 0:8e949d38885c 263 if(CardReader.writeable()) {
williequesada 0:8e949d38885c 264 CardReader.putc(SOH);
williequesada 0:8e949d38885c 265 CardReader.putc(ADDR);
williequesada 0:8e949d38885c 266 CardReader.putc(LEN);
williequesada 0:8e949d38885c 267 CardReader.putc(LEN);
williequesada 0:8e949d38885c 268 CardReader.putc(CARD_POSITION);
williequesada 0:8e949d38885c 269 CardReader.putc(EOT);
williequesada 0:8e949d38885c 270 CardReader.putc(BBCA);
williequesada 0:8e949d38885c 271 }
williequesada 0:8e949d38885c 272 wait_ms(250);
williequesada 0:8e949d38885c 273 for(int i=0; i<=CardReader_Counter; i++) {
williequesada 0:8e949d38885c 274 Computer.printf("%c",CardReader_Buffer[i]);
williequesada 0:8e949d38885c 275 if(CardReader_Buffer[i]==R_POSITION1) {
williequesada 0:8e949d38885c 276 Computer.printf("\n Tarjeta en posicion incorrecta "); // Mal colocada la tarjeta
williequesada 0:8e949d38885c 277 StateReader[4]='N';
williequesada 0:8e949d38885c 278
williequesada 0:8e949d38885c 279 return 0;
williequesada 0:8e949d38885c 280 }
williequesada 0:8e949d38885c 281 if(CardReader_Buffer[i]==R_POSITION2) {
williequesada 0:8e949d38885c 282 Computer.printf("\n Tarjeta en posicion correcta "); // Bien colocada la tarjeta
williequesada 0:8e949d38885c 283 StateReader[4]='A';
williequesada 0:8e949d38885c 284
williequesada 0:8e949d38885c 285 return 1;
williequesada 0:8e949d38885c 286 }
williequesada 0:8e949d38885c 287 if(CardReader_Buffer[i]==R_INVALID) {
williequesada 0:8e949d38885c 288 Computer.printf("\n Invalido "); // Comando Invalido
williequesada 0:8e949d38885c 289 StateReader[4]='N';
williequesada 0:8e949d38885c 290 return 0;
williequesada 0:8e949d38885c 291 }
williequesada 0:8e949d38885c 292 if(CardReader_Buffer[i]==R_ERROR) {
williequesada 0:8e949d38885c 293 Computer.printf("\n Error "); // Error
williequesada 0:8e949d38885c 294 StateReader[4]='E';
williequesada 0:8e949d38885c 295 return 0;
williequesada 0:8e949d38885c 296 }
williequesada 0:8e949d38885c 297 if(CardReader_Buffer[i]==R_COMAND_ERROR) {
williequesada 0:8e949d38885c 298 Computer.printf("\n Comando error ");// Error en comando
williequesada 0:8e949d38885c 299 StateReader[4]='C';
williequesada 0:8e949d38885c 300 return 0;
williequesada 0:8e949d38885c 301 }
williequesada 0:8e949d38885c 302 }
williequesada 0:8e949d38885c 303 return 2;
williequesada 0:8e949d38885c 304 }
williequesada 0:8e949d38885c 305
williequesada 0:8e949d38885c 306 int ReadCard(uint32_t TimeOut)
williequesada 0:8e949d38885c 307 {
williequesada 0:8e949d38885c 308 CardReader_Counter=0;
williequesada 0:8e949d38885c 309 StateReader[5]='S';
williequesada 0:8e949d38885c 310 StateReader[6]='S';
williequesada 0:8e949d38885c 311 if(StateReader[4]=='A') {
williequesada 0:8e949d38885c 312 Computer.printf("\n Retirar Tarjeta en un solo movimiento");
williequesada 0:8e949d38885c 313 if(CardReader.writeable()) {
williequesada 0:8e949d38885c 314 CardReader.putc(SOH);
williequesada 0:8e949d38885c 315 CardReader.putc(ADDR);
williequesada 0:8e949d38885c 316 CardReader.putc(LEN);
williequesada 0:8e949d38885c 317 CardReader.putc(LEN);
williequesada 0:8e949d38885c 318 CardReader.putc(ARM_MODE);
williequesada 0:8e949d38885c 319 CardReader.putc(EOT);
williequesada 0:8e949d38885c 320 CardReader.putc(BBCE);
williequesada 0:8e949d38885c 321 }
williequesada 0:8e949d38885c 322 wait_ms(300);
williequesada 0:8e949d38885c 323 for(int i=0; i<=CardReader_Counter; i++) {
williequesada 0:8e949d38885c 324 Computer.printf("%c",CardReader_Buffer[i]);
williequesada 0:8e949d38885c 325 if(CardReader_Buffer[i]==R_ACTION) {
williequesada 0:8e949d38885c 326 Computer.printf("\n Accion"); // Accion ejecutada
williequesada 0:8e949d38885c 327 StateReader[5]='A';
williequesada 0:8e949d38885c 328 }
williequesada 0:8e949d38885c 329 if(CardReader_Buffer[i]==R_INVALID) {
williequesada 0:8e949d38885c 330 Computer.printf("\n Invalido "); // Comando Invalido
williequesada 0:8e949d38885c 331 StateReader[5]='N';
williequesada 0:8e949d38885c 332 }
williequesada 0:8e949d38885c 333 if(CardReader_Buffer[i]==R_ERROR) {
williequesada 0:8e949d38885c 334 Computer.printf("\n Error "); // Error
williequesada 0:8e949d38885c 335 StateReader[5]='E';
williequesada 0:8e949d38885c 336 }
williequesada 0:8e949d38885c 337 if(CardReader_Buffer[i]==R_COMAND_ERROR) {
williequesada 0:8e949d38885c 338 Computer.printf("\n Comando error ");// Error en comando
williequesada 0:8e949d38885c 339 StateReader[5]='C';
williequesada 0:8e949d38885c 340 }
williequesada 0:8e949d38885c 341 }
williequesada 0:8e949d38885c 342 CardReader_Counter=0;
williequesada 0:8e949d38885c 343 Inicio=BaseClock.read_ms();
williequesada 0:8e949d38885c 344 while(CardReader_Counter==0) { // Esperando introduccion de tarjeta
williequesada 0:8e949d38885c 345 Fin=BaseClock.read_ms();
williequesada 0:8e949d38885c 346 Transcurrido=Fin-Inicio;
williequesada 0:8e949d38885c 347 if(StateReader[5]=='C'||StateReader[5]=='E'||StateReader[5]=='N') {
williequesada 0:8e949d38885c 348 Computer.printf("\n Error en comando");
williequesada 0:8e949d38885c 349 break;
williequesada 0:8e949d38885c 350 }
williequesada 0:8e949d38885c 351 if(StateReader[5]=='S') {
williequesada 0:8e949d38885c 352 Computer.printf("\n Sin Respuesta");
williequesada 0:8e949d38885c 353 break;
williequesada 0:8e949d38885c 354 }
williequesada 0:8e949d38885c 355 if(Transcurrido>TimeOut) {
williequesada 0:8e949d38885c 356 Computer.printf("\n Tiempo de respuesta superado");
williequesada 0:8e949d38885c 357 if(CardReader.writeable()) {
williequesada 0:8e949d38885c 358 CardReader.putc(SOH);
williequesada 0:8e949d38885c 359 CardReader.putc(ADDR);
williequesada 0:8e949d38885c 360 CardReader.putc(LEN);
williequesada 0:8e949d38885c 361 CardReader.putc(LEN);
williequesada 0:8e949d38885c 362 CardReader.putc(ARM_ABORT);
williequesada 0:8e949d38885c 363 CardReader.putc(EOT);
williequesada 0:8e949d38885c 364 CardReader.putc(BBCG);
williequesada 0:8e949d38885c 365 }
williequesada 0:8e949d38885c 366 StateReader[5]='T';
williequesada 0:8e949d38885c 367 break;
williequesada 0:8e949d38885c 368 }
williequesada 0:8e949d38885c 369 }
williequesada 0:8e949d38885c 370 wait_ms(200);
williequesada 0:8e949d38885c 371 for(int i=0; i<=CardReader_Counter; i++) {
williequesada 0:8e949d38885c 372 Computer.printf("%c",CardReader_Buffer[i]);
williequesada 0:8e949d38885c 373 Computer.printf("-%2X-",CardReader_Buffer[i]);
williequesada 0:8e949d38885c 374 if(CardReader_Buffer[i]==R_NO_MAG_CARD) {
williequesada 0:8e949d38885c 375 Computer.printf("\n Deteccion nula "); // No se detecta banda magnetica
williequesada 0:8e949d38885c 376 StateReader[6]='N';
williequesada 0:8e949d38885c 377 return 0;
williequesada 0:8e949d38885c 378 }
williequesada 0:8e949d38885c 379 if(CardReader_Buffer[i]==R_ACTION) {
williequesada 0:8e949d38885c 380 Computer.printf("\n Tarjeta leida "); // Tarjeta leida
williequesada 0:8e949d38885c 381 StateReader[6]='A';
williequesada 0:8e949d38885c 382 return 1;
williequesada 0:8e949d38885c 383 }
williequesada 0:8e949d38885c 384 if(CardReader_Buffer[i]==R_INVALID) {
williequesada 0:8e949d38885c 385 Computer.printf("\n Invalido "); // Comando Invalido
williequesada 0:8e949d38885c 386 StateReader[6]='N';
williequesada 0:8e949d38885c 387 return 0;
williequesada 0:8e949d38885c 388 }
williequesada 0:8e949d38885c 389 if(CardReader_Buffer[i]==R_ERROR) {
williequesada 0:8e949d38885c 390 Computer.printf("\n Error "); // Error
williequesada 0:8e949d38885c 391 StateReader[6]='E';
williequesada 0:8e949d38885c 392 return 0;
williequesada 0:8e949d38885c 393 }
williequesada 0:8e949d38885c 394 if(CardReader_Buffer[i]==R_COMAND_ERROR) {
williequesada 0:8e949d38885c 395 Computer.printf("\n Error comando "); // Error en comando
williequesada 0:8e949d38885c 396 StateReader[6]='C';
williequesada 0:8e949d38885c 397 return 0;
williequesada 0:8e949d38885c 398 }
williequesada 0:8e949d38885c 399 }
williequesada 0:8e949d38885c 400 }
williequesada 0:8e949d38885c 401 return 0;
williequesada 0:8e949d38885c 402 }
williequesada 0:8e949d38885c 403
williequesada 0:8e949d38885c 404 int RecibeDataCard()
williequesada 0:8e949d38885c 405 {
williequesada 0:8e949d38885c 406 if (StateReader[6]=='A') {
williequesada 0:8e949d38885c 407 CardReader_Counter=0;
williequesada 0:8e949d38885c 408 if(CardReader.writeable()) {
williequesada 0:8e949d38885c 409 CardReader.putc(SOH); // 00000001
williequesada 0:8e949d38885c 410 CardReader.putc(ADDR); // 00000000
williequesada 0:8e949d38885c 411 CardReader.putc(LEN); // 00000000
williequesada 0:8e949d38885c 412 CardReader.putc(LEN); // 00000000
williequesada 0:8e949d38885c 413 CardReader.putc(MAG_ISO_T2); // 01010101
williequesada 0:8e949d38885c 414 CardReader.putc(EOT); // 00000100
williequesada 0:8e949d38885c 415 CardReader.putc(BBCK);
williequesada 0:8e949d38885c 416 }
williequesada 0:8e949d38885c 417 wait_ms(200);
williequesada 0:8e949d38885c 418 for(int i=0; i<=CardReader_Counter; i++) {
williequesada 0:8e949d38885c 419 if(CardReader_Buffer[i]==R_NO_DATA) {
williequesada 0:8e949d38885c 420 Computer.printf("Sin lectura\n");
williequesada 0:8e949d38885c 421 return 0;
williequesada 0:8e949d38885c 422 }
williequesada 0:8e949d38885c 423 Computer.putc(CardReader_Buffer[i]);
williequesada 0:8e949d38885c 424 if(CardReader_Buffer[i]=='=') {
williequesada 0:8e949d38885c 425 Computer.printf("Datos leidos ");
williequesada 0:8e949d38885c 426 for(int i=0; i<37; i++) {
williequesada 0:8e949d38885c 427 Track2[i]=CardReader_Buffer[i+4];
williequesada 0:8e949d38885c 428 }
williequesada 0:8e949d38885c 429 Computer.printf("<%s>\n",Track2);
williequesada 0:8e949d38885c 430 return 1;
williequesada 0:8e949d38885c 431 }
williequesada 0:8e949d38885c 432 }
williequesada 0:8e949d38885c 433 }
williequesada 0:8e949d38885c 434 return 2;
williequesada 0:8e949d38885c 435 }
williequesada 0:8e949d38885c 436
williequesada 0:8e949d38885c 437 int RetiroTarjeta(uint32_t TiempoFuera)
williequesada 0:8e949d38885c 438 {
williequesada 0:8e949d38885c 439 Computer.printf("Retiro tarjeta\n");
williequesada 0:8e949d38885c 440 Inicio=BaseClock.read_ms();
williequesada 0:8e949d38885c 441 while(true) {
williequesada 0:8e949d38885c 442 if(PositionCard()==0) {
williequesada 0:8e949d38885c 443 return 1;
williequesada 0:8e949d38885c 444 } else {
williequesada 0:8e949d38885c 445
williequesada 0:8e949d38885c 446 Computer.printf("Retire tarjeta");
williequesada 0:8e949d38885c 447
williequesada 0:8e949d38885c 448 }
williequesada 0:8e949d38885c 449 Fin=BaseClock.read_ms();
williequesada 0:8e949d38885c 450 Transcurrido=Fin-Inicio;
williequesada 0:8e949d38885c 451 if(Transcurrido>TiempoFuera) {
williequesada 0:8e949d38885c 452 StateReader[1]='T';
williequesada 0:8e949d38885c 453 return 0;
williequesada 0:8e949d38885c 454 }
williequesada 0:8e949d38885c 455 }
williequesada 0:8e949d38885c 456 }
williequesada 0:8e949d38885c 457
williequesada 0:8e949d38885c 458 uint8_t IngresoTarjeta(uint32_t TimeOut)
williequesada 0:8e949d38885c 459 {
williequesada 0:8e949d38885c 460 Computer.printf("Funcion ingreso de tarjeta\n");
williequesada 0:8e949d38885c 461
williequesada 0:8e949d38885c 462 Inicio=BaseClock.read_ms();
williequesada 0:8e949d38885c 463 while(true) {
williequesada 0:8e949d38885c 464 if(PositionCard()==1) {
williequesada 0:8e949d38885c 465 Computer.printf("Tarjeta ingresada\n");
williequesada 0:8e949d38885c 466 StateReader[1]='A';
williequesada 0:8e949d38885c 467 StateReader[2]='A';
williequesada 0:8e949d38885c 468 StateReader[3]='A';
williequesada 0:8e949d38885c 469 return 1;
williequesada 0:8e949d38885c 470 }
williequesada 0:8e949d38885c 471 Fin=BaseClock.read_ms();
williequesada 0:8e949d38885c 472 Transcurrido=Fin-Inicio;
williequesada 0:8e949d38885c 473 if(Transcurrido>TimeOut) {
williequesada 0:8e949d38885c 474 Computer.printf("Tiempo limite\n");
williequesada 0:8e949d38885c 475 StateReader[1]='T';
williequesada 0:8e949d38885c 476 StateReader[2]='N';
williequesada 0:8e949d38885c 477 StateReader[3]='N';
williequesada 0:8e949d38885c 478 return 0;
williequesada 0:8e949d38885c 479 }
williequesada 0:8e949d38885c 480 }
williequesada 0:8e949d38885c 481 }
williequesada 0:8e949d38885c 482
williequesada 0:8e949d38885c 483 uint8_t GetCard(char Salida,uint32_t TimeOutEntrada,uint32_t TimeOutSalida)
williequesada 0:8e949d38885c 484 {
williequesada 0:8e949d38885c 485 //CardReaderStatus=[Reset,ArmDebug,DetectionOn,DetectionOff,Position,Arm,Read]
williequesada 0:8e949d38885c 486 // C-> Command error
williequesada 0:8e949d38885c 487 // A-> Accepted
williequesada 0:8e949d38885c 488 // N-> Invalid
williequesada 0:8e949d38885c 489 // E-> Error
williequesada 0:8e949d38885c 490 // N-> No detection
williequesada 0:8e949d38885c 491 // S-> Without answer
williequesada 0:8e949d38885c 492 // T-> Time out
williequesada 0:8e949d38885c 493 // Se pide al usuario por pantalla la intrduccion de la tarjeta
williequesada 0:8e949d38885c 494
williequesada 0:8e949d38885c 495 Computer.printf("Introduzca tarjeta");
williequesada 0:8e949d38885c 496 Computer.printf("debito o credito");
williequesada 0:8e949d38885c 497 sprintf(Track2,"0000000000000000000000000000000000000");
williequesada 0:8e949d38885c 498
williequesada 0:8e949d38885c 499 if(ResetCard()==1) {
williequesada 0:8e949d38885c 500 while(true) {
williequesada 0:8e949d38885c 501 uint8_t RespuestaIngresoTarjeta = IngresoTarjeta(TimeOutEntrada);
williequesada 0:8e949d38885c 502 if(RespuestaIngresoTarjeta==1) {
williequesada 0:8e949d38885c 503
williequesada 0:8e949d38885c 504 Computer.printf("Retire tarjeta");
williequesada 0:8e949d38885c 505
williequesada 0:8e949d38885c 506 }
williequesada 0:8e949d38885c 507 if(RespuestaIngresoTarjeta==0) {
williequesada 0:8e949d38885c 508 wait(3);
williequesada 0:8e949d38885c 509 return USER_FINISH;
williequesada 0:8e949d38885c 510 }
williequesada 0:8e949d38885c 511 if(RespuestaIngresoTarjeta==2) {
williequesada 0:8e949d38885c 512 return USER_FINISH;
williequesada 0:8e949d38885c 513 }
williequesada 0:8e949d38885c 514
williequesada 0:8e949d38885c 515 uint8_t RespuestaReadCard=ReadCard(TimeOutSalida); // Se le la tarjeta al retirarse
williequesada 0:8e949d38885c 516 if(RespuestaReadCard==2) {
williequesada 0:8e949d38885c 517 return USER_FINISH;
williequesada 0:8e949d38885c 518 }
williequesada 0:8e949d38885c 519
williequesada 0:8e949d38885c 520 uint8_t DataResult=RecibeDataCard(); // Se corrobora que la informacion de la tajeta es la corre
williequesada 0:8e949d38885c 521 if(DataResult==0) {
williequesada 0:8e949d38885c 522 Computer.printf("Banda magnetica");
williequesada 0:8e949d38885c 523 Computer.printf("ilegible");
williequesada 0:8e949d38885c 524 wait(2);
williequesada 0:8e949d38885c 525 if(RetiroTarjeta(7000)) {
williequesada 0:8e949d38885c 526 Computer.printf("Introduzca tarjeta");
williequesada 0:8e949d38885c 527 Computer.printf("debito o credito");
williequesada 0:8e949d38885c 528 } else {
williequesada 0:8e949d38885c 529 return USER_FINISH;
williequesada 0:8e949d38885c 530 }
williequesada 0:8e949d38885c 531 }
williequesada 0:8e949d38885c 532 if(DataResult==1) {
williequesada 0:8e949d38885c 533 return Salida;
williequesada 0:8e949d38885c 534 }
williequesada 0:8e949d38885c 535 if(DataResult==2) {
williequesada 0:8e949d38885c 536 Computer.printf("Banda magnetica");
williequesada 0:8e949d38885c 537 Computer.printf("ilegible");
williequesada 0:8e949d38885c 538 wait(2);
williequesada 0:8e949d38885c 539 if(RetiroTarjeta(7000)) {
williequesada 0:8e949d38885c 540 Computer.printf("Introduzca tarjeta");
williequesada 0:8e949d38885c 541 Computer.printf("debito o credito");
williequesada 0:8e949d38885c 542
williequesada 0:8e949d38885c 543 } else {
williequesada 0:8e949d38885c 544 return USER_FINISH;
williequesada 0:8e949d38885c 545 }
williequesada 0:8e949d38885c 546 }
williequesada 0:8e949d38885c 547 }
williequesada 0:8e949d38885c 548 } else {
williequesada 0:8e949d38885c 549 Computer.printf("Error");
williequesada 0:8e949d38885c 550 return USER_FINISH;
williequesada 0:8e949d38885c 551 }
williequesada 0:8e949d38885c 552 }
williequesada 0:8e949d38885c 553
williequesada 0:8e949d38885c 554 int main()
williequesada 0:8e949d38885c 555 {
williequesada 0:8e949d38885c 556 BaseClock.start();
williequesada 0:8e949d38885c 557 CardReader.format(8, Serial::None, 1);
williequesada 0:8e949d38885c 558 CardReader.baud(9600);
williequesada 0:8e949d38885c 559 Computer.format(8, Serial::None, 1);
williequesada 0:8e949d38885c 560 Computer.baud(9600);
williequesada 0:8e949d38885c 561 CardReader.attach(&Interrupt_CardReader);
williequesada 0:8e949d38885c 562 while(1) {
williequesada 0:8e949d38885c 563 CardReaderPower=1;
williequesada 0:8e949d38885c 564 Max232=1;
williequesada 0:8e949d38885c 565 Computer.printf("iniciando proceso\n");
williequesada 0:8e949d38885c 566 wait(2);
williequesada 0:8e949d38885c 567 GetCard(USER_TIME,20000,5000);
williequesada 0:8e949d38885c 568 CardReaderPower=0;
williequesada 0:8e949d38885c 569 Max232=0;
williequesada 0:8e949d38885c 570 wait(2);
williequesada 0:8e949d38885c 571 }
williequesada 0:8e949d38885c 572 }