CardReader
CardReader.cpp@0:e5dbf1e75384, 2019-06-04 (annotated)
- Committer:
- williequesada
- Date:
- Tue Jun 04 18:05:14 2019 +0000
- Revision:
- 0:e5dbf1e75384
pablo
Who changed what in which revision?
User | Revision | Line number | New 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 |