CardReader

CardReader.cpp

Committer:
williequesada
Date:
2019-06-04
Revision:
0:e5dbf1e75384

File content as of revision 0:e5dbf1e75384:

#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;
};