CardReader

Revision:
0:e5dbf1e75384
diff -r 000000000000 -r e5dbf1e75384 CardReader.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CardReader.cpp	Tue Jun 04 18:05:14 2019 +0000
@@ -0,0 +1,207 @@
+#include "CardReader.h"
+#include "mbed.h"
+#include "stdio.h"
+
+#define     START       0x30
+#define     COMMAND     0x31
+#define     ERROR       0x32
+#define     INVALID     0x33
+#define     NOTHING     0x34
+
+
+const char SOH=1;
+const char EOT=4;
+const char ESP=33;
+const char ADDR=0;
+const char LEN=0;
+const char CARD_POSITION='8';
+const char CARD_LOCK='{';
+const char CARD_UNLOCK='}';
+const char DEV_STATUS='$';
+const char DEV_RESET=127;
+const char ARM_MODE='P';
+const char ARM_DEBUG='p';
+const char ARM_ABORT=27;
+const char SIG_START='?';
+const char FCT_READ='R';
+const char MAG_CUSTOM_T1='U';
+const char MAG_CUSTOM_T2='V';
+const char MAG_CUSTOM_T3='W';
+const char MAG_ISO_T1='Q';
+const char MAG_ISO_T2='R';
+const char MAG_ISO_T3='S';
+const char MAG_CUSTOM_F='4';
+const char BBCA='=';
+const char BBCB='~';
+const char BBCC='x';
+const char BBCD='!';
+const char BBCE='U';
+const char BBCF='u';
+const char BBCG=30;
+const char BBCH='d';
+const char BBCI='z';
+const char BBCJ='T';
+const char BBCK='W';
+const char BBCL='V';
+const char BBCM=10;
+const char R_ACTION='^';
+const char R_ERROR='*';
+const char R_INVALID='!';
+const char R_NO_DATA='+';
+const char R_COMAND_ERROR='?';
+const char R_START=':';
+const char R_POSITION1='q';
+const char R_POSITION2='s';
+const char R_NO_MAG_CARD='>';
+const char R_MAG_DETECT_ON='(';
+const char R_MAG_DETECT_OFF=')';
+
+char StateReader[7]= {'0','0','0','0','0','0','0'};
+char CardReader_Buffer[255];
+int CardReader_Counter=0;
+unsigned long Inicio, Fin, Transcurrido;
+Timer TimeOutClock;
+
+READER::READER(PinName TX, PinName RX) : CardReader(TX,RX)
+{
+    CardReader.attach(this,&READER::Interrupt);
+}
+void READER::Interrupt()
+{
+    CardReader_Buffer[CardReader_Counter]=CardReader.getc();
+    CardReader_Counter++;
+}
+
+uint8_t READER::Reset()
+{
+    CardReader_Counter=0;
+    StateReader[0]='S';
+    CardReader.putc(SOH);           // 00000001
+    CardReader.putc(ADDR);          // 00000000
+    CardReader.putc(LEN);           // 00000000
+    CardReader.putc(LEN);           // 00000000
+    CardReader.putc(DEV_RESET);     // 01111111
+    CardReader.putc(EOT);           // 00000100
+    CardReader.putc(BBCI);          // 01111010
+    wait_ms(3000);
+    for(int i=0; i<=CardReader_Counter; i++) {
+        if(CardReader_Buffer[i]==R_START) {
+            //Computer.printf("\n START");             // Encendido
+            StateReader[0]='A';
+            return START;
+        }
+        if(CardReader_Buffer[i]==R_INVALID) {
+            //Computer.printf("\n INVALID ");          // Comando Invalido
+            StateReader[1]='N';
+            return INVALID;
+        }
+        if(CardReader_Buffer[i]==R_ERROR) {
+            //Computer.printf("\n ERROR ");            // Error
+            StateReader[1]='E';
+            return ERROR;
+        }
+        if(CardReader_Buffer[i]==R_COMAND_ERROR) {
+            //Computer.printf("\n COMAND ERROR ");     // Error en comando
+            StateReader[1]='C';
+            return COMMAND;
+        }
+    }
+    return NOTHING;
+};
+
+uint8_t READER::Detection()
+{
+    CardReader_Counter=0;
+    StateReader[1]='S';
+    StateReader[2]='S';
+    StateReader[3]='S';
+    if(StateReader[0]=='A') {               // Se envia el comando Arm Debug
+        //Computer.printf("\n Introducir Tarjeta");
+        CardReader.putc(SOH);
+        CardReader.putc(ADDR);
+        CardReader.putc(LEN);
+        CardReader.putc(LEN);
+        CardReader.putc(ARM_DEBUG);
+        CardReader.putc(EOT);
+        CardReader.putc(BBCF);
+        wait_ms(500);
+        for(int i=0; i<=CardReader_Counter; i++) {
+            if(CardReader_Buffer[i]==R_ACTION) {
+                //Computer.printf("\n ACTION ");      // Accion ejecutada
+                StateReader[1]='A';
+            }
+            if(CardReader_Buffer[i]==R_INVALID) {
+                //Computer.printf("\n INVALID ");     // Comando Invalido
+                StateReader[1]='N';
+            }
+            if(CardReader_Buffer[i]==R_ERROR) {
+                //Computer.printf("\n ERROR ");       // Error
+                StateReader[1]='E';
+            }
+            if(CardReader_Buffer[i]==R_COMAND_ERROR) {
+                //Computer.printf("\n COMAND ERROR ");// Error en comando
+                StateReader[1]='C';
+            }
+        }
+        CardReader_Counter=0;
+
+        Inicio=TimeOutClock.read_ms();
+        while(CardReader_Counter==0) {       // Esperando introduccion de tarjeta
+            Fin=TimeOutClock.read_ms();
+            Transcurrido=Fin-Inicio;
+            if(StateReader[1]=='C'||StateReader[1]=='E'||StateReader[1]=='N') {
+                //Computer.printf("\n Error en comando");
+                break;
+            }
+            if(StateReader[1]=='S') {
+                //Computer.printf("\n Sin Respuesta");
+                break;
+            }
+            if(Transcurrido>40000) {
+                //Computer.printf("\n Tiempo de respuesta");
+                CardReader.putc(SOH);
+                CardReader.putc(ADDR);
+                CardReader.putc(LEN);
+                CardReader.putc(LEN);
+                CardReader.putc(ARM_ABORT);
+                CardReader.putc(EOT);
+                CardReader.putc(BBCG);
+                break;
+            }
+        }
+        wait_ms(1000);
+        for(int i=0; i<=CardReader_Counter; i++) {
+            if(CardReader_Buffer[i]==R_NO_MAG_CARD) {
+                //Computer.printf("\n Deteccion Nula ");      // No se detecta banda magnetica
+                StateReader[2]='N';
+                StateReader[3]='N';
+            }
+            if(CardReader_Buffer[i]==R_MAG_DETECT_ON) {
+                //Computer.printf("\n Deteccion On ");        // Se inicia verificacion de banda
+                StateReader[2]='A';
+            }
+            if(CardReader_Buffer[i]==R_MAG_DETECT_OFF) {
+                //Computer.printf("\n Deteccion Off ");       // Se termina verificacion de banda
+                StateReader[3]='A';
+            }
+            if(CardReader_Buffer[i]==R_ACTION) {
+                //Computer.printf("\n Action Arm Abort ");      // Accion ejecutada
+                StateReader[1]='T';
+            }
+        }
+    }
+    return 0x00;
+};
+uint8_t READER::Position()
+{
+    return 0x00;
+};
+uint8_t READER::Read()
+{
+    return 0x00;
+};
+char * READER::Data()
+{
+    return 0x00;
+};
+