CardReader

Files at this revision

API Documentation at this revision

Comitter:
williequesada
Date:
Tue Jun 04 18:05:14 2019 +0000
Commit message:
pablo

Changed in this revision

CardReader.cpp Show annotated file Show diff for this revision Revisions of this file
CardReader.h Show annotated file Show diff for this revision Revisions of this file
--- /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;
+};
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CardReader.h	Tue Jun 04 18:05:14 2019 +0000
@@ -0,0 +1,25 @@
+
+
+#ifndef MBED_READER_H
+#define MBED_READER_H
+ 
+#include "mbed.h"
+ 
+class READER {
+public:
+    READER(PinName TX, PinName RX);
+
+    void    Interrupt();
+    uint8_t Reset();
+    uint8_t Detection();
+    uint8_t Position();
+    uint8_t Read();
+    char *Data();   
+  
+private:  
+    Serial       CardReader;
+};
+ 
+#endif
+ 
+ 
\ No newline at end of file