SmartCard reader. PC is interface through USB or TCPport. SmartCard is interfaced through UART@ 1MHz, DIV372

Dependencies:   EthernetNetIf mbed

SmartCardReader.cpp

Committer:
bcalin1984
Date:
2011-02-27
Revision:
0:5bf6fcf71548

File content as of revision 0:5bf6fcf71548:

/*
This file encapsulates logic for SmartCard Reader

Author: Calin Bira
Date: 28.02.2011
*/

#include "SmartCardReader.h"

SmartCardReader::SmartCardReader(Serial *_dut, DigitalOut *_vcc, DigitalOut *_rst,PwmOut *_clock, char *_format)
    {
        int databits,stopbits;
        Serial::Parity parity;
        
        freq = 1000*1000;
        divfact = 372;
                
        dut = _dut;
        rst = _rst;
        vcc = _vcc;
        clk = _clock;
        
        BytesToIgnore = 0;
        ReceiveBufferIndex = 0;
                
        databits = _format[0] - '0';
        switch (_format[1])
        {
            case 'E': {parity = Serial::Even; break;}
            case 'O': {parity = Serial::Odd; break;}
            default: {parity = Serial::None; break;}
        }
        
        stopbits = _format[2] - '0';
        dut->format(databits,parity,stopbits);
        
        setClock(freq);
        clk->write(0.5);// 50% duty cycle
        
        
    }
    
void SmartCardReader::setClock(int Hz)
    {
        freq = Hz;
        clk->period_us(1000*1000/freq);
        dut->baud(freq/divfact);
    }

void SmartCardReader::cold_reset()
    {
        *vcc = 0;
        *rst = 0;
        wait(0.1);
        *vcc = 1;
        wait(0.1);
        
        while (dut->readable())
            dut->getc();
        *rst = 1;
    }
    
void SmartCardReader::warm_reset()
    {
        *rst = 0;
        wait(0.1);
        *rst = 1;
    }

/*    
void SmartCardReader::Relay_PC_SC()
        {
            static char ignore=0;
            
            while (dut->readable()) //if there is data from smartcard
            {
                if (ignore>0)
                {
                    dut->getc();//ignore data: this is data from pc
                    ignore--;
                }
                else pc->putc(dut->getc());//send to pc
            }
            
            while (pc->readable()) //if there is data from pc
            {
                ignore++;
                dut->putc(pc->getc());  //send data to smartcard
            }    
        }
*/
void SmartCardReader::send(char *buf, int len)
{
    while(len-- >0)
    {
        BytesToIgnore++;
        dut->putc(*buf++);
    }
}

int SmartCardReader::receive(char *buf)
{
    int OldIndex = ReceiveBufferIndex;
    for (int i=0; i < ReceiveBufferIndex; i++)
    {
        buf[i] =  ReceiveBuffer[i];
    }
    ReceiveBufferIndex = 0;
    return OldIndex;
}

void SmartCardReader::doEvents()
    {
        //Relay_PC_SC();
          
            while (dut->readable()) //if there is data from smartcard
            {
                if (BytesToIgnore > 0)
                {
                    dut->getc();//ignore data: this is data from previous send
                    BytesToIgnore--;
                }
                else 
                {
                    if (ReceiveBufferIndex < ReceiveBufferLen)
                        ReceiveBuffer[ReceiveBufferIndex++] = dut->getc();
                    else dut->getc();//discard data, no space in buffer
                }
            }  
    }