![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
CardReader_Funcional
main.cpp@0:8e949d38885c, 2019-06-04 (annotated)
- Committer:
- williequesada
- Date:
- Tue Jun 04 18:01:55 2019 +0000
- Revision:
- 0:8e949d38885c
pablo
Who changed what in which revision?
User | Revision | Line number | New 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 | } |