First commit 07/07/2002
This commit is contained in:
commit
3a630dba1d
341
Main.cpp
Normal file
341
Main.cpp
Normal file
@ -0,0 +1,341 @@
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
#include <vcl.h>
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
#pragma hdrstop
|
||||
|
||||
#include "Main.h"
|
||||
#include "SerieCfg.h"
|
||||
//---------------------------------------------------------------------------
|
||||
#pragma package(smart_init)
|
||||
#pragma resource "*.dfm"
|
||||
TSmartCard_Reader *SmartCard_Reader;
|
||||
//---------------------------------------------------------------------------
|
||||
__fastcall TSmartCard_Reader::TSmartCard_Reader(TComponent* Owner)
|
||||
: TForm(Owner)
|
||||
{
|
||||
TabSheet1->TabVisible=false;
|
||||
|
||||
hCom=INVALID_HANDLE_VALUE;
|
||||
atr = true; inver = false;
|
||||
sprintf( serconfig1, "COM2: baud=9600 parity=O data=8 stop=2" );
|
||||
sprintf( serconfig2, "COM2: baud=9600 parity=O data=8 stop=2" );
|
||||
mlog->Lines->Clear();
|
||||
Logger( "Inicialización del programa" );
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TSmartCard_Reader::Logger(AnsiString log)
|
||||
{
|
||||
mlog->Lines->Add( log );
|
||||
StatusBar1->SimpleText = AnsiString( TDateTime::CurrentDateTime() ) + " :: " + log;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TSmartCard_Reader::Puertoserie1Click(TObject *Sender)
|
||||
{
|
||||
TSerieConf *conf;
|
||||
conf = new TSerieConf(this);
|
||||
conf->ShowModal();
|
||||
if ( conf->ModalResult == mrOk )
|
||||
{
|
||||
/* Cambiamos las cadenas de configuracion*/
|
||||
try {
|
||||
sprintf(serconfig1,"%s: baud=%d parity=%c data=%1d stop=%1d",
|
||||
conf->comPort->Items->Strings[conf->comPort->ItemIndex].c_str(),conf->baudiosA->Text.ToInt(),conf->pariA->Text.c_str()[0],conf->bitsA->Text.ToInt(),conf->stopA->Text.ToInt() );
|
||||
sprintf(serconfig2,"%s: baud=%d parity=%c data=%1d stop=%1d",
|
||||
conf->comPort->Items->Strings[conf->comPort->ItemIndex].c_str(),conf->baudiosD->Text.ToInt(),conf->pariD->Text.c_str()[0],conf->bitsD->Text.ToInt(),conf->stopD->Text.ToInt() );
|
||||
atr = conf->ATR->Checked;
|
||||
inver = conf->ConvenioInverso->Checked;
|
||||
Logger( "Configuracion del puerto cambiada a: " + AnsiString( serconfig2 ) );
|
||||
} catch(...) {
|
||||
Logger( "Error interpretando nueva configuración" );
|
||||
}
|
||||
/* y desconectamos */
|
||||
Desconectar1Click(0);
|
||||
}
|
||||
|
||||
delete conf;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void __fastcall TSmartCard_Reader::Conectar1Click(TObject *Sender)
|
||||
{
|
||||
if ( ! Conectar1->Checked )
|
||||
{
|
||||
Desconectar1->Checked = false;
|
||||
Conectar1->Checked = true;
|
||||
OpenCOM();
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TSmartCard_Reader::Desconectar1Click(TObject *Sender)
|
||||
{
|
||||
if ( ! Desconectar1->Checked )
|
||||
{
|
||||
Desconectar1->Checked = true;
|
||||
Conectar1->Checked = false;
|
||||
CloseCOM();
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TSmartCard_Reader::OpenCOM(void)
|
||||
{
|
||||
char buf[256];
|
||||
bool err = false;
|
||||
|
||||
if ( hCom == INVALID_HANDLE_VALUE )
|
||||
{
|
||||
if ( atr )
|
||||
{
|
||||
Logger( "Inicializando el puerto para LEER ATR: "+AnsiString(serconfig1) );
|
||||
if ( Open(serconfig1)<0 )
|
||||
{
|
||||
Logger( "Error en la apertura del puerto para ATR" ); err = true;
|
||||
} else {
|
||||
ATR1Click(0);
|
||||
}
|
||||
}
|
||||
if ( !err )
|
||||
{
|
||||
Logger( "Inicializando el puerto: "+AnsiString(serconfig2) );
|
||||
if ( SetConfig(serconfig2)<0 )
|
||||
{
|
||||
Logger( "No puedo cambiar la velocidad" ); err = true;
|
||||
} else {
|
||||
/*
|
||||
in[0]=0x21;in[1]=0xC1;in[2]=0x01;in[3]=0x58;in[4]=0xB9;
|
||||
Send(out,buf,in,5,5);
|
||||
*/
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TSmartCard_Reader::CloseCOM(void)
|
||||
{
|
||||
if ( hCom != INVALID_HANDLE_VALUE )
|
||||
{
|
||||
CloseHandle(hCom);
|
||||
hCom=INVALID_HANDLE_VALUE;
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
/*
|
||||
Funciones extraida integramente de VIAMOSC,(c) No te importa, versión 0.1
|
||||
Brevementes comentadas por mi (JDsoft para no confundirme)
|
||||
*/
|
||||
int __fastcall TSmartCard_Reader::DoReset(void)
|
||||
{
|
||||
EscapeCommFunction(hCom,SETRTS);
|
||||
Sleep(50);
|
||||
EscapeCommFunction(hCom,CLRRTS);
|
||||
Sleep(250);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int __fastcall TSmartCard_Reader::SetConfig(const char *serconfig)
|
||||
{
|
||||
DCB dcb;
|
||||
BOOL fSuccess;
|
||||
DWORD dwError;
|
||||
ComErr[0]=0;
|
||||
if (hCom==INVALID_HANDLE_VALUE) { strcpy(ComErr,"Port not open");return -1; }
|
||||
fSuccess = GetCommState(hCom, &dcb);
|
||||
if (!fSuccess) { strcpy(ComErr,"GetCommState failed");CloseHandle(hCom);return -1; }
|
||||
fSuccess = BuildCommDCB(serconfig,&dcb);
|
||||
if (!fSuccess) { strcpy(ComErr,"BuildCommDCB failed");CloseHandle(hCom);return -1; }
|
||||
dcb.fRtsControl=RTS_CONTROL_DISABLE;
|
||||
fSuccess = SetCommState(hCom, &dcb);
|
||||
if (!fSuccess) { dwError=GetLastError();strcpy(ComErr,"SetCommState failed");CloseHandle(hCom);return -1; }
|
||||
return 0;
|
||||
}
|
||||
|
||||
DWORD __fastcall TSmartCard_Reader::SRead(BYTE *buf,DWORD bytes_to_read,DWORD wait)
|
||||
{
|
||||
DWORD bytes_read,cnt,t;
|
||||
BYTE *buf2;
|
||||
cnt=0;
|
||||
buf2=buf;
|
||||
ReadFile(hCom,(void*)buf,bytes_to_read,&bytes_read,NULL);
|
||||
cnt+=bytes_read;
|
||||
buf2+=bytes_read;
|
||||
t=clock();
|
||||
while ((clock()<t+wait) && cnt<bytes_to_read)
|
||||
{
|
||||
ReadFile(hCom,(void*)buf2,bytes_to_read-cnt,&bytes_read,NULL);
|
||||
cnt+=bytes_read;
|
||||
buf2+=bytes_read;
|
||||
}
|
||||
if(inver)
|
||||
for(int i=0;i<cnt;++i) buf[i]=inverso(buf[i]);
|
||||
return cnt;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
DWORD __fastcall TSmartCard_Reader::SWrite(BYTE *buf,DWORD bytes_to_write)
|
||||
{
|
||||
DWORD n,i,j,k,l,tt;
|
||||
BYTE buf2[256],ch;
|
||||
for(i=n=l=0;i<bytes_to_write;++i)
|
||||
{
|
||||
// tt=rdtsc();
|
||||
if(inver) ch=inverso(buf[i]);
|
||||
else ch=buf[i];
|
||||
WriteFile(hCom,(void*)&ch,1,&j,NULL);
|
||||
n+=j;
|
||||
ReadFile(hCom,&buf2[l],n-l,&k,NULL);
|
||||
l+=k;
|
||||
// while(rdtsc()-tt<delay);
|
||||
}
|
||||
if(l<n) SRead(&buf2[l],n-l,20);
|
||||
return n;
|
||||
}
|
||||
|
||||
unsigned char __fastcall TSmartCard_Reader::inverso(unsigned char ch)
|
||||
{
|
||||
unsigned char r;
|
||||
int i;
|
||||
for(r=i=0;i<8;++i) { r<<=1;r|=(ch&1);ch>>=1; }
|
||||
return ~r;
|
||||
}
|
||||
|
||||
int __fastcall TSmartCard_Reader::Send(unsigned char *out,char *buf,unsigned char *in,int m,int RL)
|
||||
{
|
||||
int n,k;
|
||||
SWrite(in,m);
|
||||
k=SRead(out,RL,2500);
|
||||
setarr(buf,out,k);
|
||||
return k;
|
||||
}
|
||||
|
||||
#define min(x,y) ((x<y)?(x):(y))
|
||||
|
||||
// Dado un caracter (con notacion hexadecimal)
|
||||
// devuelve su valor en decimal
|
||||
// Ej. '0' == 0 y 'B' == 11
|
||||
int __fastcall TSmartCard_Reader::getnyb(char c)
|
||||
{
|
||||
if((c<='9')&&(c>='0')) return c-'0';
|
||||
else if((c<='F')&&(c>='A')) return c-'A'+10;
|
||||
else return -1;
|
||||
}
|
||||
|
||||
// Dado un puntero a un par de caracteres, (con notacion hex)
|
||||
// devuelve el número que representa
|
||||
// Ej. '3B' == 3<<4 + 11
|
||||
int __fastcall TSmartCard_Reader::getbyte(char *buf)
|
||||
{
|
||||
int v,w;
|
||||
v=getnyb(toupper(*buf++));
|
||||
w=getnyb(toupper(*buf++));
|
||||
if((v<0)||(w<0)) return -1;
|
||||
return (v<<4)+w;
|
||||
}
|
||||
|
||||
// Dada una cadena del tipo "AF 32 2D E6"
|
||||
// devuelve en la cadena a los valores en decimal:
|
||||
// n == num_elementos a procesar de la cadena buf...
|
||||
// Ejemplo: para la cadena anterior a[0]=0xAF; a[1]=0x32; a[2]=0x2D; a[3]=0xE6
|
||||
int __fastcall TSmartCard_Reader::getarr(unsigned char *a,char *buf,int n)
|
||||
{
|
||||
int i;
|
||||
for(i=0;i<n;++i,buf+=2)
|
||||
{
|
||||
int v;
|
||||
while(*buf==' ') ++buf;
|
||||
v=getbyte(buf);
|
||||
if(v<0) return -1;
|
||||
a[i]=v;
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
// Igual que antes, pero para toda la cadena 'buf'
|
||||
int __fastcall TSmartCard_Reader::getvar(unsigned char *a,char *buf)
|
||||
{
|
||||
int n;
|
||||
n=0;
|
||||
while(*buf!=0)
|
||||
{
|
||||
int v;
|
||||
while(*buf==' ') ++buf;
|
||||
if(*buf==0) return n;
|
||||
v=getbyte(buf);buf+=2;
|
||||
if(v<0) return -1;
|
||||
a[n++]=v;
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
|
||||
// Dado un array de valores, los convierte a hexadecimal
|
||||
// a[0]=0x1D y a[1]=0x24 ==> buf = "1D 24 ";
|
||||
int __fastcall TSmartCard_Reader::setarr(char *buf,unsigned char *a,int n)
|
||||
{
|
||||
int i;
|
||||
for(i=0;i<n;++i) sprintf(&buf[3*i],"%02x ",a[i]);
|
||||
return n;
|
||||
}
|
||||
void __fastcall TSmartCard_Reader::Salir1Click(TObject *Sender)
|
||||
{
|
||||
Close();
|
||||
}
|
||||
|
||||
int __fastcall TSmartCard_Reader::Open(const char *serconfig)
|
||||
{
|
||||
COMMTIMEOUTS timeouts;
|
||||
char string[16];
|
||||
BOOL fSuccess;
|
||||
ComErr[0]=0;
|
||||
memcpy(string,serconfig,4);
|
||||
string[4]=0x00;
|
||||
hCom = CreateFile(string,GENERIC_READ | GENERIC_WRITE,0, NULL,OPEN_EXISTING, 0,NULL);
|
||||
if (hCom == INVALID_HANDLE_VALUE) { strcpy(ComErr,"Could not create handle");return -1; }
|
||||
fSuccess = SetupComm(hCom,1024,1024);
|
||||
if (!fSuccess) { strcpy(ComErr,"SetupComm failed");CloseHandle(hCom);return -1; }
|
||||
fSuccess = GetCommTimeouts(hCom,&timeouts);
|
||||
if (!fSuccess) { strcpy(ComErr,"GetCommTimeouts failed");CloseHandle(hCom);return -1; }
|
||||
timeouts.ReadIntervalTimeout=MAXDWORD;
|
||||
fSuccess = SetCommTimeouts(hCom,&timeouts);
|
||||
if (!fSuccess) { strcpy(ComErr,"SetCommTimeouts failed");CloseHandle(hCom);return -1; }
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* MIS FUNCIONES AUXILIARES
|
||||
*/
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TSmartCard_Reader::ATR1Click(TObject *Sender)
|
||||
{
|
||||
char buf[255];
|
||||
DoReset();
|
||||
lenATR=SRead(ATR,27,30);
|
||||
setarr(buf,ATR,lenATR);
|
||||
Logger( "ATR == " + AnsiString( buf ) );
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
void __fastcall TSmartCard_Reader::Edit3KeyPress(TObject *Sender,
|
||||
char &Key)
|
||||
{
|
||||
if ( Key==VK_RETURN )
|
||||
SendCommand( Edit3->Text );
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void __fastcall TSmartCard_Reader::BitBtn1Click(TObject *Sender)
|
||||
{
|
||||
SendCommand( Edit3->Text );
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TSmartCard_Reader::SendCommand( AnsiString cmd )
|
||||
{
|
||||
char values[255],out[255];
|
||||
getvar( values, cmd.c_str() );
|
||||
Send( out, values, values, cmd.Length(), 254 );
|
||||
Memo1->Lines->Insert(0, "-----------------------------------------" );
|
||||
Memo1->Lines->Insert(0, "Respuesta: "+AnsiString(values) );
|
||||
Memo1->Lines->Insert(0, "Enviado comando: "+cmd );
|
||||
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
208
Main.dfm
Normal file
208
Main.dfm
Normal file
@ -0,0 +1,208 @@
|
||||
object SmartCard_Reader: TSmartCard_Reader
|
||||
Left = 191
|
||||
Top = 116
|
||||
Width = 572
|
||||
Height = 368
|
||||
Caption = 'SmartCard_Reader'
|
||||
Color = clBtnFace
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -11
|
||||
Font.Name = 'MS Sans Serif'
|
||||
Font.Style = []
|
||||
Menu = MainMenu1
|
||||
OldCreateOrder = False
|
||||
PixelsPerInch = 96
|
||||
TextHeight = 13
|
||||
object StatusBar1: TStatusBar
|
||||
Left = 0
|
||||
Top = 303
|
||||
Width = 564
|
||||
Height = 19
|
||||
Panels = <>
|
||||
SimplePanel = False
|
||||
end
|
||||
object PageControl1: TPageControl
|
||||
Left = 0
|
||||
Top = 0
|
||||
Width = 564
|
||||
Height = 303
|
||||
ActivePage = cmdManual
|
||||
Align = alClient
|
||||
MultiLine = True
|
||||
TabOrder = 1
|
||||
TabPosition = tpBottom
|
||||
object TabSheet1: TTabSheet
|
||||
Caption = 'TabSheet1'
|
||||
object Label1: TLabel
|
||||
Left = 0
|
||||
Top = 16
|
||||
Width = 77
|
||||
Height = 13
|
||||
Caption = 'Dirección inicial:'
|
||||
end
|
||||
object Label2: TLabel
|
||||
Left = 104
|
||||
Top = 16
|
||||
Width = 44
|
||||
Height = 13
|
||||
Caption = 'Longitud:'
|
||||
end
|
||||
object Edit1: TEdit
|
||||
Left = 0
|
||||
Top = 32
|
||||
Width = 80
|
||||
Height = 21
|
||||
TabOrder = 0
|
||||
Text = '0'
|
||||
end
|
||||
object Edit2: TEdit
|
||||
Left = 104
|
||||
Top = 32
|
||||
Width = 80
|
||||
Height = 21
|
||||
TabOrder = 1
|
||||
Text = '0'
|
||||
end
|
||||
object UpDown1: TUpDown
|
||||
Left = 80
|
||||
Top = 32
|
||||
Width = 12
|
||||
Height = 21
|
||||
Associate = Edit1
|
||||
Min = 0
|
||||
Position = 0
|
||||
TabOrder = 2
|
||||
Wrap = False
|
||||
end
|
||||
object UpDown2: TUpDown
|
||||
Left = 184
|
||||
Top = 32
|
||||
Width = 12
|
||||
Height = 21
|
||||
Associate = Edit2
|
||||
Min = 0
|
||||
Position = 0
|
||||
TabOrder = 3
|
||||
Wrap = False
|
||||
end
|
||||
object Button1: TButton
|
||||
Left = 208
|
||||
Top = 32
|
||||
Width = 75
|
||||
Height = 21
|
||||
Caption = 'Leer &Eeprom'
|
||||
TabOrder = 4
|
||||
end
|
||||
end
|
||||
object TabHistorico: TTabSheet
|
||||
Caption = 'Histórico'
|
||||
ImageIndex = 1
|
||||
object mlog: TMemo
|
||||
Left = 0
|
||||
Top = 0
|
||||
Width = 556
|
||||
Height = 275
|
||||
Align = alClient
|
||||
Lines.Strings = (
|
||||
'mlog')
|
||||
ScrollBars = ssVertical
|
||||
TabOrder = 0
|
||||
end
|
||||
end
|
||||
object cmdManual: TTabSheet
|
||||
Caption = 'cmdManual'
|
||||
ImageIndex = 2
|
||||
object Label3: TLabel
|
||||
Left = 8
|
||||
Top = 16
|
||||
Width = 80
|
||||
Height = 13
|
||||
Caption = 'Enviar comando:'
|
||||
end
|
||||
object Label4: TLabel
|
||||
Left = 0
|
||||
Top = 48
|
||||
Width = 142
|
||||
Height = 13
|
||||
Caption = 'Respuesta al último comando:'
|
||||
end
|
||||
object Memo1: TMemo
|
||||
Left = 0
|
||||
Top = 64
|
||||
Width = 556
|
||||
Height = 211
|
||||
Align = alBottom
|
||||
Color = clAppWorkSpace
|
||||
ReadOnly = True
|
||||
TabOrder = 0
|
||||
end
|
||||
object Edit3: TEdit
|
||||
Left = 96
|
||||
Top = 8
|
||||
Width = 433
|
||||
Height = 21
|
||||
TabOrder = 1
|
||||
OnKeyPress = Edit3KeyPress
|
||||
end
|
||||
object BitBtn1: TBitBtn
|
||||
Left = 528
|
||||
Top = 5
|
||||
Width = 25
|
||||
Height = 25
|
||||
Caption = '>>'
|
||||
TabOrder = 2
|
||||
OnClick = BitBtn1Click
|
||||
end
|
||||
end
|
||||
end
|
||||
object MainMenu1: TMainMenu
|
||||
Left = 168
|
||||
Top = 120
|
||||
object Archivo1: TMenuItem
|
||||
Caption = '&Archivo'
|
||||
object Acercade1: TMenuItem
|
||||
Caption = 'Acerca &de...'
|
||||
end
|
||||
object N1: TMenuItem
|
||||
Caption = '-'
|
||||
end
|
||||
object Salir1: TMenuItem
|
||||
Caption = '&Salir'
|
||||
OnClick = Salir1Click
|
||||
end
|
||||
end
|
||||
object Configuracin1: TMenuItem
|
||||
Caption = '&Configuración'
|
||||
object Puertoserie1: TMenuItem
|
||||
Caption = '&Puerto serie'
|
||||
OnClick = Puertoserie1Click
|
||||
end
|
||||
object N2: TMenuItem
|
||||
Caption = '-'
|
||||
end
|
||||
object Conectar1: TMenuItem
|
||||
Caption = 'Conectado'
|
||||
GroupIndex = 1
|
||||
RadioItem = True
|
||||
OnClick = Conectar1Click
|
||||
end
|
||||
object Desconectar1: TMenuItem
|
||||
Caption = 'Desconectado'
|
||||
Checked = True
|
||||
GroupIndex = 1
|
||||
RadioItem = True
|
||||
OnClick = Desconectar1Click
|
||||
end
|
||||
object N4: TMenuItem
|
||||
Caption = '-'
|
||||
GroupIndex = 2
|
||||
end
|
||||
object ATR1: TMenuItem
|
||||
Caption = 'Reset'
|
||||
GroupIndex = 2
|
||||
OnClick = ATR1Click
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
89
Main.h
Normal file
89
Main.h
Normal file
@ -0,0 +1,89 @@
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
#ifndef MainH
|
||||
#define MainH
|
||||
//---------------------------------------------------------------------------
|
||||
#include <Classes.hpp>
|
||||
#include <Controls.hpp>
|
||||
#include <StdCtrls.hpp>
|
||||
#include <Forms.hpp>
|
||||
#include <Menus.hpp>
|
||||
#include <ComCtrls.hpp>
|
||||
#include <Buttons.hpp>
|
||||
//---------------------------------------------------------------------------
|
||||
class TSmartCard_Reader : public TForm
|
||||
{
|
||||
__published: // IDE-managed Components
|
||||
TMainMenu *MainMenu1;
|
||||
TMenuItem *Archivo1;
|
||||
TMenuItem *Acercade1;
|
||||
TMenuItem *N1;
|
||||
TMenuItem *Salir1;
|
||||
TMenuItem *Configuracin1;
|
||||
TMenuItem *Puertoserie1;
|
||||
TMenuItem *N2;
|
||||
TMenuItem *Conectar1;
|
||||
TMenuItem *Desconectar1;
|
||||
TMenuItem *ATR1;
|
||||
TMenuItem *N4;
|
||||
TStatusBar *StatusBar1;
|
||||
TPageControl *PageControl1;
|
||||
TTabSheet *TabSheet1;
|
||||
TTabSheet *TabHistorico;
|
||||
TMemo *mlog;
|
||||
TEdit *Edit1;
|
||||
TLabel *Label1;
|
||||
TEdit *Edit2;
|
||||
TUpDown *UpDown1;
|
||||
TUpDown *UpDown2;
|
||||
TLabel *Label2;
|
||||
TButton *Button1;
|
||||
TTabSheet *cmdManual;
|
||||
TMemo *Memo1;
|
||||
TLabel *Label3;
|
||||
TLabel *Label4;
|
||||
TEdit *Edit3;
|
||||
TBitBtn *BitBtn1;
|
||||
void __fastcall Puertoserie1Click(TObject *Sender);
|
||||
void __fastcall Conectar1Click(TObject *Sender);
|
||||
void __fastcall Desconectar1Click(TObject *Sender);
|
||||
void __fastcall Salir1Click(TObject *Sender);
|
||||
void __fastcall ATR1Click(TObject *Sender);
|
||||
void __fastcall Edit3KeyPress(TObject *Sender, char &Key);
|
||||
void __fastcall BitBtn1Click(TObject *Sender);
|
||||
private: // User declarations
|
||||
void __fastcall SendCommand( AnsiString cmd );
|
||||
public: // User declarations
|
||||
__fastcall TSmartCard_Reader(TComponent* Owner);
|
||||
void __fastcall Logger(AnsiString log);
|
||||
|
||||
|
||||
/* Funciones para tratar con el puerto serie... */
|
||||
HANDLE hCom;
|
||||
char ComErr[40],serconfig1[40],serconfig2[40];
|
||||
unsigned char ATR[40],ATRinv[40],lenATR;
|
||||
unsigned long delay;
|
||||
bool inver, atr;
|
||||
|
||||
void __fastcall CloseCOM(void);
|
||||
void __fastcall OpenCOM(void);
|
||||
|
||||
DWORD __fastcall SRead(BYTE *buf,DWORD bytes_to_read,DWORD wait);
|
||||
DWORD __fastcall SWrite(BYTE *buf,DWORD bytes_to_write);
|
||||
int __fastcall Send(unsigned char *out,char *buf,unsigned char *in,int m,int RL);
|
||||
|
||||
int __fastcall DoReset(void);
|
||||
int __fastcall SetConfig(const char *serconfig);
|
||||
unsigned char __fastcall inverso(unsigned char ch);
|
||||
int __fastcall getbyte(char *buf);
|
||||
int __fastcall getnyb(char c);
|
||||
int __fastcall getarr(unsigned char *a,char *buf,int n);
|
||||
int __fastcall getvar(unsigned char *a,char *buf);
|
||||
int __fastcall setarr(char *buf,unsigned char *a,int n);
|
||||
int __fastcall Open(const char *serconfig);
|
||||
|
||||
};
|
||||
//---------------------------------------------------------------------------
|
||||
extern PACKAGE TSmartCard_Reader *SmartCard_Reader;
|
||||
//---------------------------------------------------------------------------
|
||||
#endif
|
9
README.md
Normal file
9
README.md
Normal file
@ -0,0 +1,9 @@
|
||||
#SmartCard
|
||||
|
||||
|
||||
*07/07/2002*
|
||||
|
||||
ToDo: wwtcf?
|
||||
|
||||
|
||||

|
26
SerieCfg.cpp
Normal file
26
SerieCfg.cpp
Normal file
@ -0,0 +1,26 @@
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
#include <vcl.h>
|
||||
#pragma hdrstop
|
||||
|
||||
#include "SerieCfg.h"
|
||||
//---------------------------------------------------------------------------
|
||||
#pragma package(smart_init)
|
||||
#pragma resource "*.dfm"
|
||||
TSerieConf *SerieConf;
|
||||
//---------------------------------------------------------------------------
|
||||
__fastcall TSerieConf::TSerieConf(TComponent* Owner)
|
||||
: TForm(Owner)
|
||||
{
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TSerieConf::cancelarClick(TObject *Sender)
|
||||
{
|
||||
ModalResult = mrCancel;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TSerieConf::aceptarClick(TObject *Sender)
|
||||
{
|
||||
ModalResult = mrOk;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
199
SerieCfg.dfm
Normal file
199
SerieCfg.dfm
Normal file
@ -0,0 +1,199 @@
|
||||
object SerieConf: TSerieConf
|
||||
Left = 308
|
||||
Top = 598
|
||||
AutoScroll = False
|
||||
BorderIcons = [biSystemMenu]
|
||||
Caption = 'Configuración del Puerto serie'
|
||||
ClientHeight = 172
|
||||
ClientWidth = 285
|
||||
Color = clBtnFace
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -11
|
||||
Font.Name = 'MS Sans Serif'
|
||||
Font.Style = []
|
||||
OldCreateOrder = False
|
||||
Position = poScreenCenter
|
||||
PixelsPerInch = 96
|
||||
TextHeight = 13
|
||||
object Label1: TLabel
|
||||
Left = 0
|
||||
Top = 16
|
||||
Width = 34
|
||||
Height = 13
|
||||
Caption = 'Puerto:'
|
||||
end
|
||||
object Label11: TLabel
|
||||
Left = 192
|
||||
Top = 16
|
||||
Width = 16
|
||||
Height = 13
|
||||
Caption = 'bits'
|
||||
end
|
||||
object Label4: TLabel
|
||||
Left = 136
|
||||
Top = 16
|
||||
Width = 37
|
||||
Height = 13
|
||||
Caption = 'baudios'
|
||||
end
|
||||
object Label12: TLabel
|
||||
Left = 224
|
||||
Top = 16
|
||||
Width = 20
|
||||
Height = 13
|
||||
Caption = 'pari.'
|
||||
end
|
||||
object Label13: TLabel
|
||||
Left = 256
|
||||
Top = 16
|
||||
Width = 20
|
||||
Height = 13
|
||||
Caption = 'stop'
|
||||
end
|
||||
object Label7: TLabel
|
||||
Left = 40
|
||||
Top = 40
|
||||
Width = 70
|
||||
Height = 13
|
||||
Caption = 'Antes del reset'
|
||||
end
|
||||
object Label8: TLabel
|
||||
Left = 40
|
||||
Top = 64
|
||||
Width = 85
|
||||
Height = 13
|
||||
Caption = 'Después del reset'
|
||||
end
|
||||
object Label2: TLabel
|
||||
Left = 40
|
||||
Top = 88
|
||||
Width = 30
|
||||
Height = 13
|
||||
Caption = 'Delay:'
|
||||
end
|
||||
object aceptar: TBitBtn
|
||||
Left = 208
|
||||
Top = 112
|
||||
Width = 75
|
||||
Height = 25
|
||||
Caption = '&Aceptar'
|
||||
TabOrder = 0
|
||||
OnClick = aceptarClick
|
||||
end
|
||||
object cancelar: TBitBtn
|
||||
Left = 208
|
||||
Top = 144
|
||||
Width = 75
|
||||
Height = 25
|
||||
Caption = '&Cancelar'
|
||||
TabOrder = 1
|
||||
OnClick = cancelarClick
|
||||
end
|
||||
object comPort: TComboBox
|
||||
Left = 40
|
||||
Top = 8
|
||||
Width = 89
|
||||
Height = 21
|
||||
ItemHeight = 13
|
||||
TabOrder = 2
|
||||
Text = 'COM1'
|
||||
Items.Strings = (
|
||||
'COM1'
|
||||
'COM2'
|
||||
'COM3'
|
||||
'COM4')
|
||||
end
|
||||
object stopA: TEdit
|
||||
Left = 256
|
||||
Top = 32
|
||||
Width = 25
|
||||
Height = 21
|
||||
TabOrder = 3
|
||||
Text = '2'
|
||||
end
|
||||
object pariA: TEdit
|
||||
Left = 224
|
||||
Top = 32
|
||||
Width = 25
|
||||
Height = 21
|
||||
TabOrder = 4
|
||||
Text = 'O'
|
||||
end
|
||||
object bitsA: TEdit
|
||||
Left = 192
|
||||
Top = 32
|
||||
Width = 25
|
||||
Height = 21
|
||||
TabOrder = 5
|
||||
Text = '8'
|
||||
end
|
||||
object baudiosA: TEdit
|
||||
Left = 128
|
||||
Top = 32
|
||||
Width = 57
|
||||
Height = 21
|
||||
TabOrder = 6
|
||||
Text = '4800'
|
||||
end
|
||||
object baudiosD: TEdit
|
||||
Left = 128
|
||||
Top = 56
|
||||
Width = 57
|
||||
Height = 21
|
||||
TabOrder = 7
|
||||
Text = '57600'
|
||||
end
|
||||
object bitsD: TEdit
|
||||
Left = 192
|
||||
Top = 56
|
||||
Width = 25
|
||||
Height = 21
|
||||
TabOrder = 8
|
||||
Text = '8'
|
||||
end
|
||||
object pariD: TEdit
|
||||
Left = 224
|
||||
Top = 56
|
||||
Width = 25
|
||||
Height = 21
|
||||
TabOrder = 9
|
||||
Text = 'O'
|
||||
end
|
||||
object stopD: TEdit
|
||||
Left = 256
|
||||
Top = 56
|
||||
Width = 25
|
||||
Height = 21
|
||||
TabOrder = 10
|
||||
Text = '2'
|
||||
end
|
||||
object delayTime: TEdit
|
||||
Left = 128
|
||||
Top = 80
|
||||
Width = 153
|
||||
Height = 21
|
||||
TabOrder = 11
|
||||
Text = '5000'
|
||||
end
|
||||
object ConvenioInverso: TCheckBox
|
||||
Left = 40
|
||||
Top = 112
|
||||
Width = 161
|
||||
Height = 17
|
||||
Caption = 'Convenio Inverso'
|
||||
Checked = True
|
||||
State = cbChecked
|
||||
TabOrder = 12
|
||||
end
|
||||
object ATR: TCheckBox
|
||||
Left = 40
|
||||
Top = 128
|
||||
Width = 161
|
||||
Height = 17
|
||||
Caption = 'ATR despues de conectar'
|
||||
Checked = True
|
||||
State = cbChecked
|
||||
TabOrder = 13
|
||||
end
|
||||
end
|
46
SerieCfg.h
Normal file
46
SerieCfg.h
Normal file
@ -0,0 +1,46 @@
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
#ifndef SerieCfgH
|
||||
#define SerieCfgH
|
||||
//---------------------------------------------------------------------------
|
||||
#include <Classes.hpp>
|
||||
#include <Controls.hpp>
|
||||
#include <StdCtrls.hpp>
|
||||
#include <Forms.hpp>
|
||||
#include <Buttons.hpp>
|
||||
//---------------------------------------------------------------------------
|
||||
class TSerieConf : public TForm
|
||||
{
|
||||
__published: // IDE-managed Components
|
||||
TBitBtn *aceptar;
|
||||
TBitBtn *cancelar;
|
||||
TComboBox *comPort;
|
||||
TLabel *Label1;
|
||||
TLabel *Label11;
|
||||
TLabel *Label4;
|
||||
TLabel *Label12;
|
||||
TLabel *Label13;
|
||||
TEdit *stopA;
|
||||
TEdit *pariA;
|
||||
TEdit *bitsA;
|
||||
TEdit *baudiosA;
|
||||
TEdit *baudiosD;
|
||||
TEdit *bitsD;
|
||||
TEdit *pariD;
|
||||
TEdit *stopD;
|
||||
TLabel *Label7;
|
||||
TLabel *Label8;
|
||||
TLabel *Label2;
|
||||
TEdit *delayTime;
|
||||
TCheckBox *ConvenioInverso;
|
||||
TCheckBox *ATR;
|
||||
void __fastcall cancelarClick(TObject *Sender);
|
||||
void __fastcall aceptarClick(TObject *Sender);
|
||||
private: // User declarations
|
||||
public: // User declarations
|
||||
__fastcall TSerieConf(TComponent* Owner);
|
||||
};
|
||||
//---------------------------------------------------------------------------
|
||||
extern PACKAGE TSerieConf *SerieConf;
|
||||
//---------------------------------------------------------------------------
|
||||
#endif
|
BIN
TEMP/emv.exe
Normal file
BIN
TEMP/emv.exe
Normal file
Binary file not shown.
15
TEMP/mondex.spt
Normal file
15
TEMP/mondex.spt
Normal file
@ -0,0 +1,15 @@
|
||||
00 a4 08 0c 02 00
|
||||
2f 00
|
||||
00 b2 01 04 00 02
|
||||
00 b2 01 04 00 29
|
||||
00 a4 04 0c 08 00
|
||||
a0 00 00 00 02 01 99 04
|
||||
80 24 00 00 00 03
|
||||
80 22 00 00 00 6c
|
||||
80 54 00 00 00 33
|
||||
80 2a 00 00 00 1c
|
||||
80 38 00 00 03 05
|
||||
55 53 44
|
||||
end
|
||||
|
||||
|
42
TEMP/readme.txt
Normal file
42
TEMP/readme.txt
Normal file
@ -0,0 +1,42 @@
|
||||
PCSC Test Program
|
||||
v.0.7 (c) Andrew Whitaker
|
||||
|
||||
It can run in either of threemodes.
|
||||
|
||||
Mode 1:
|
||||
Command line parameter mondex
|
||||
ie: emv mondex
|
||||
Automatically does
|
||||
Application Selection
|
||||
Purse Register
|
||||
Register
|
||||
Payment Register
|
||||
Read Pocket Record
|
||||
Currency Enquiry
|
||||
|
||||
Mode 2:
|
||||
With a command line parameter of the name of a script. I have enclosed a sample script that does the same functions as mode 1 but in a non intelligent way, eg. Register length hard coded not read from purse register.
|
||||
So: emv mondex.spt is the command line. The file extension can be anything you like.
|
||||
The structure of the file is as follows:
|
||||
|
||||
|
||||
00 a4 08 0c 02 00
|
||||
2f 00
|
||||
This is CLA INS P1 P2 LC LE
|
||||
Then data
|
||||
|
||||
00 b2 01 04 00 02
|
||||
No LC so no data line
|
||||
|
||||
80 38 00 00 03 05
|
||||
55 53 44
|
||||
LC and LE so data line
|
||||
|
||||
end
|
||||
The end just shows the end of the script file.
|
||||
|
||||
|
||||
Mode 3:
|
||||
|
||||
emv test
|
||||
forces the pc/sc resource manager dialog to appear and connects to the reader and then disconnects.
|
2
leeme.txt
Normal file
2
leeme.txt
Normal file
@ -0,0 +1,2 @@
|
||||
Inicializando el puerto: COM2: baud=9600 parity=O data=8 stop=2
|
||||
ATR == 23 9b ff ff 9b fd ff f6 ff
|
109
smartcard.bpr
Normal file
109
smartcard.bpr
Normal file
@ -0,0 +1,109 @@
|
||||
<?xml version='1.0' encoding='utf-8' ?>
|
||||
<!-- C++Builder XML Project -->
|
||||
<PROJECT>
|
||||
<MACROS>
|
||||
<VERSION value="BCB.05.03"/>
|
||||
<PROJECT value="smartcard.exe"/>
|
||||
<OBJFILES value="smartcard.obj Main.obj SerieCfg.obj"/>
|
||||
<RESFILES value="smartcard.res"/>
|
||||
<IDLFILES value=""/>
|
||||
<IDLGENFILES value=""/>
|
||||
<DEFFILE value=""/>
|
||||
<RESDEPEN value="$(RESFILES) Main.dfm SerieCfg.dfm"/>
|
||||
<LIBFILES value=""/>
|
||||
<LIBRARIES value="VCL50.lib"/>
|
||||
<SPARELIBS value="VCL50.lib"/>
|
||||
<PACKAGES value="VCL50.bpi VCLX50.bpi VCLDB50.bpi QRPT50.bpi VCLBDE50.bpi VCLIE50.bpi
|
||||
INETDB50.bpi INET50.bpi NMFAST50.bpi dclocx50.bpi CabForCB.bpi
|
||||
CoolPack.bpi JDsoft.bpi PhantomPack.bpi VCLIB50.bpi VCLMID50.bpi
|
||||
WEBMID50.bpi VCLDBX50.bpi TEEQR50.bpi asgc5.bpi RAS_Tools.bpi
|
||||
ZCommonCB5.bpi ZDbwareCB5.bpi ZMySqlCB5.bpi ZDb2SqlCB5.bpi ZIbSqlCB5.bpi
|
||||
ZMsSqlCB5.bpi ZOraSqlCB5.bpi ZPgSqlCB5.bpi TEEUI50.bpi TEEDB50.bpi
|
||||
TEE50.bpi DSS50.bpi bcbsmp50.bpi VCLADO50.bpi ibsmp50.bpi bcbie50.bpi
|
||||
bcb2kaxserver50.bpi"/>
|
||||
<PATHCPP value=".;"/>
|
||||
<PATHPAS value=".;"/>
|
||||
<PATHRC value=".;"/>
|
||||
<PATHASM value=".;"/>
|
||||
<DEBUGLIBPATH value="$(BCB)\lib\debug"/>
|
||||
<RELEASELIBPATH value="$(BCB)\lib\release"/>
|
||||
<LINKER value="tlink32"/>
|
||||
<USERDEFINES value="_DEBUG"/>
|
||||
<SYSDEFINES value="NO_STRICT"/>
|
||||
<MAINSOURCE value="smartcard.cpp"/>
|
||||
<INCLUDEPATH value="..\ViaMosc;$(BCB)\include;$(BCB)\include\vcl"/>
|
||||
<LIBPATH value="..\ViaMosc;$(BCB)\Projects\Lib;..\VCLs\lib;$(BCB)\lib\obj;$(BCB)\lib"/>
|
||||
<WARNINGS value="-w-par"/>
|
||||
</MACROS>
|
||||
<OPTIONS>
|
||||
<IDLCFLAGS value="-I..\ViaMosc -I$(BCB)\include -I$(BCB)\include\vcl -src_suffix cpp
|
||||
-D_DEBUG -boa"/>
|
||||
<CFLAG1 value="-Od -H=$(BCB)\lib\vcl50.csm -Hc -Vx -Ve -X- -r- -a8 -b- -k -y -v -vi- -c
|
||||
-tW -tWM"/>
|
||||
<PFLAGS value="-$YD -$W -$O- -v -JPHNE -M"/>
|
||||
<RFLAGS value=""/>
|
||||
<AFLAGS value="/mx /w2 /zd"/>
|
||||
<LFLAGS value="-D"" -aa -Tpe -x -Gn -v"/>
|
||||
</OPTIONS>
|
||||
<LINKER>
|
||||
<ALLOBJ value="c0w32.obj sysinit.obj $(OBJFILES)"/>
|
||||
<ALLRES value="$(RESFILES)"/>
|
||||
<ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cp32mt.lib"/>
|
||||
</LINKER>
|
||||
<IDEOPTIONS>
|
||||
[Version Info]
|
||||
IncludeVerInfo=0
|
||||
AutoIncBuild=0
|
||||
MajorVer=1
|
||||
MinorVer=0
|
||||
Release=0
|
||||
Build=0
|
||||
Debug=0
|
||||
PreRelease=0
|
||||
Special=0
|
||||
Private=0
|
||||
DLL=0
|
||||
Locale=3082
|
||||
CodePage=1252
|
||||
|
||||
[Version Info Keys]
|
||||
CompanyName=
|
||||
FileDescription=
|
||||
FileVersion=1.0.0.0
|
||||
InternalName=
|
||||
LegalCopyright=
|
||||
LegalTrademarks=
|
||||
OriginalFilename=
|
||||
ProductName=
|
||||
ProductVersion=1.0.0.0
|
||||
Comments=
|
||||
|
||||
[Excluded Packages]
|
||||
C:\Mis documentos\Fuentes de Programacion\C++ Builder\CAP\LM2000_vcl\LM2000_vcl.bpl=Funciones para el Manejo del LM2000
|
||||
|
||||
[Debugging]
|
||||
DebugSourceDirs=$(BCB)\source\vcl
|
||||
|
||||
[Parameters]
|
||||
RunParams=
|
||||
HostApplication=
|
||||
RemoteHost=
|
||||
RemotePath=
|
||||
RemoteDebug=0
|
||||
|
||||
[Compiler]
|
||||
ShowInfoMsgs=0
|
||||
LinkDebugVcl=0
|
||||
LinkCGLIB=0
|
||||
|
||||
[CORBA]
|
||||
AddServerUnit=1
|
||||
AddClientUnit=1
|
||||
PrecompiledHeaders=1
|
||||
|
||||
[Language]
|
||||
ActiveLang=
|
||||
ProjectLang=
|
||||
RootDir=
|
||||
</IDEOPTIONS>
|
||||
</PROJECT>
|
23
smartcard.cpp
Normal file
23
smartcard.cpp
Normal file
@ -0,0 +1,23 @@
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
#include <vcl.h>
|
||||
#pragma hdrstop
|
||||
USERES("smartcard.res");
|
||||
USEFORM("Main.cpp", SmartCard_Reader);
|
||||
USEFORM("SerieCfg.cpp", SerieConf);
|
||||
//---------------------------------------------------------------------------
|
||||
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
|
||||
{
|
||||
try
|
||||
{
|
||||
Application->Initialize();
|
||||
Application->CreateForm(__classid(TSmartCard_Reader), &SmartCard_Reader);
|
||||
Application->Run();
|
||||
}
|
||||
catch (Exception &exception)
|
||||
{
|
||||
Application->ShowException(&exception);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
BIN
smartcard.exe
Normal file
BIN
smartcard.exe
Normal file
Binary file not shown.
BIN
smartcard.rar
Normal file
BIN
smartcard.rar
Normal file
Binary file not shown.
BIN
smartcard.res
Normal file
BIN
smartcard.res
Normal file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user