First commit 07/07/2002

This commit is contained in:
José David Guillén 2021-09-12 20:55:27 +02:00
commit 3a630dba1d
16 changed files with 1109 additions and 0 deletions

341
Main.cpp Normal file
View 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
View 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
View 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
View File

@ -0,0 +1,9 @@
#SmartCard
*07/07/2002*
ToDo: wwtcf?
![screenshot](/SmartCard.png "Screenshot")

26
SerieCfg.cpp Normal file
View 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
View 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
View 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

Binary file not shown.

15
TEMP/mondex.spt Normal file
View 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
View 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
View 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
View 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&quot;&quot; -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
View 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

Binary file not shown.

BIN
smartcard.rar Normal file

Binary file not shown.

BIN
smartcard.res Normal file

Binary file not shown.