//////////////////////////////////////////////////////////////// // Test Lettore Badge 2004 (c) SofTech di Germinara Francesco 2000,2004 // www.germinara.it info@germinara.it // Story: // //////////////////////////////////////////////////////////////// // Checked Version: 6/5/2004 //////////////////////////////////////////////////////////////// #include "stdafx.h" #include "FGBadgeReader.h" #include "CDlgCardReader.h" #include ".\cdlgcardreader.h" // CDlgCardReader dialog IMPLEMENT_DYNAMIC(CDlgCardReader, CDialog) CDlgCardReader::CDlgCardReader(CWnd* pParent /*=NULL*/) : CDialog(CDlgCardReader::IDD, pParent) , m_strTraccia1(_T("")) , m_strTraccia2(_T("")) , m_strTraccia3(_T("")) , m_strRowDataDebug(_T("")) , m_strNome(_T("")) , m_strCogn(_T("")) , m_strCodice(_T("")) , m_strServiceCode(_T("")) , m_strFormatCode(_T("")) , m_strScadenza(_T("")) , m_strPW(_T("")) , m_strSNLettor(_T("")) { m_bComOk=FALSE; m_bDataOK=FALSE; } CDlgCardReader::~CDlgCardReader() { } void CDlgCardReader::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDT_TRACCIA1, m_strTraccia1); DDX_Text(pDX, IDC_EDIT3IDC_EDT_TRACCIA2, m_strTraccia2); DDX_Text(pDX, IDC_EDT_TRACCIA3, m_strTraccia3); DDX_Control(pDX, IDC_SICOMMCTRL1, m_siComm); DDX_Text(pDX, IDC_EDT_ROWDATA, m_strRowDataDebug); DDX_Text(pDX, IDC_EDT_NOME, m_strNome); DDX_Text(pDX, IDC_EDT_COGN, m_strCogn); DDX_Text(pDX, IDC_EDIT5, m_strCodice); DDX_Text(pDX, IDC_EDIT6, m_strServiceCode); DDX_Text(pDX, IDC_EDIT7, m_strFormatCode); DDX_Text(pDX, IDC_EDIT8, m_strScadenza); DDX_Text(pDX, IDC_EDIT9, m_strPW); DDX_Text(pDX, IDC_EDIT10, m_strSNLettor); } BEGIN_MESSAGE_MAP(CDlgCardReader, CDialog) ON_WM_TIMER() ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1) END_MESSAGE_MAP() // CDlgCardReader message handlers BOOL CDlgCardReader::OnInitDialog() { CDialog::OnInitDialog(); m_bComOk=OpenComPort(); if(m_bComOk==TRUE){ SetTimer(IDT_CHECK_READER,100,NULL); } return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } BOOL CDlgCardReader::OpenComPort(){ BOOL sts=FALSE; int nComPort,nBitDati,nParity,nVelocita,nBitStop; CString strInfoCfg,m_strOper; BOOL stsPort=FALSE; nComPort=COMM1; nParity=ParityNone; nBitDati=WordLen8; nBitStop=StopBit1; nVelocita=Baud9600; //Ok, inizializzo... m_siComm.SetPortNumber(nComPort); m_siComm.SetBaudRate(nVelocita); m_siComm.SetParity(nParity); m_siComm.SetWordLength(nBitDati); m_siComm.SetStopBits(nBitStop); m_siComm.SetCardType(CardWinApi); m_siComm.SetCommTicks(CommTickMilliSecond); //m_siComm.SetDeltaCTS(TRUE); //m_siComm.SetDeltaDSR(TRUE); m_siComm.SetPortOpen(TRUE); stsPort=m_siComm.GetPortOpen(); if(stsPort==FALSE){ AfxMessageBox("ERRORE: Impossibile Inizializzare la Porta Seriale."); }else{ m_siComm.SetDTR(TRUE); m_siComm.SetRTS(TRUE); m_siComm.FlushRxBuffer(); m_siComm.FlushTxBuffer(); } return stsPort; } void CDlgCardReader::CloseComPort(){ m_siComm.SetPortOpen(FALSE); //Close Serial Port m_bComOk=FALSE; } void CDlgCardReader::OnOK() { if(m_bComOk) CloseComPort(); CDialog::OnOK(); } void CDlgCardReader::OnCancel() { if(m_bComOk) CloseComPort(); CDialog::OnCancel(); } BOOL CDlgCardReader::CheckDataInRX(){ long int nBytes=0; int nRetry=3; BOOL bRead=FALSE; Sleep(100); for(;;){ nBytes = m_siComm.GetBytesInReceiveBuffer(); if( nBytes > 0L) { bRead=TRUE; m_bTimeOut=FALSE; break; }else{ nRetry--; if(nRetry == 0){ bRead=FALSE; m_bTimeOut=TRUE; //AfxMessageBox("TimeOut"); break; } Sleep(300); } } return bRead; } void CDlgCardReader::OnTimer(UINT nIDEvent) { if(nIDEvent==IDT_CHECK_READER){ KillTimer(nIDEvent); strRowData=ReadRowData(); m_bDataOK=CheckData(strRowData); if(!m_bDataOK){ //Solo se non ho letto bene rileggo... m_strTraccia1=""; m_strTraccia2=""; m_strTraccia3=""; UpdateData(FALSE); SetTimer(IDT_CHECK_READER,100,NULL); }else{ //Decodifico Info Traccia 1: CheckDataTrack1(); UpdateData(FALSE); //SetTimer(IDT_CHECK_READER,100,NULL); //EndDialog(IDOK); } } } CString CDlgCardReader::ReadRowData(){ CString strData; short nChar=0x00; strData=""; long nBytes=0L; int nTry=5; REDO: CheckDataInRX(); if(!m_bTimeOut){ //Ok, leggo dati... for(;;){ nBytes = m_siComm.GetByte(&nChar); if(nBytes==1){ strData.AppendChar((char)nChar); if(nChar==0x0d){ break; } }else{ nTry--; if(nTry){ Sleep(300); goto REDO; }else break; } } } return strData; } BOOL CDlgCardReader::CheckData(CString strRowData){ m_strRowDataDebug=strRowData; UpdateData(FALSE); //Controllo Validità Dati BOOL sts=FALSE; //Caratteri di Inizio e Fine Traccia char startChTrack1='%',endChTrack1='?'; bool bTrack1=FALSE; char startChTrack2=';',endChTrack2='?'; bool bTrack2=FALSE; char startChTrack3='+',endChTrack3='?'; char startChTrack3CDL='!'; bool bTrack3=FALSE; int posIni=0,posFin=0; m_strTraccia1=""; m_strTraccia2=""; m_strTraccia3=""; if(strRowData.Find("210888")!=-1){ m_strSNLettor=strRowData; m_strSNLettor.SetAt(m_strSNLettor.GetLength()-1,0x00); } //Controllo se è traccia 1 posIni=strRowData.Find(startChTrack1); if(posIni!=-1){ //FOUND! posFin=strRowData.Find(endChTrack1); if(posFin!=-1){//Found OK. bTrack1=TRUE; m_strTraccia1=strRowData.Mid(posIni+1,posFin-posIni-1); strRowData=strRowData.Mid(posFin+1); }else{ m_strTraccia1="Errore Traccia 1"; } } //Controllo se è traccia 2 posIni=strRowData.Find(startChTrack2); if(posIni!=-1){ //FOUND! posFin=strRowData.Find(endChTrack2); if(posFin!=-1){//Found OK. bTrack2=TRUE; m_strTraccia2=strRowData.Mid(posIni+1,posFin-posIni-1); strRowData=strRowData.Mid(posFin+1); }else{ m_strTraccia2="Errore Traccia 2"; sts=FALSE; //Errore... } } //Controllo se è traccia 3 posIni=strRowData.Find(startChTrack3); if(posIni!=-1){ //FOUND! posFin=strRowData.Find(endChTrack3); if(posFin!=-1){//Found OK. bTrack2=TRUE; m_strTraccia3=strRowData.Mid(posIni,posFin-posIni); strRowData=strRowData.Mid(posFin+1); }else{ m_strTraccia3="Errore Traccia 3"; } } //Controllo se è traccia 3 CDL posIni=strRowData.Find(startChTrack3CDL); if(posIni!=-1){ //FOUND! posFin=strRowData.Find(endChTrack3); if(posFin!=-1){//Found OK. bTrack2=TRUE; m_strTraccia3=strRowData.Mid(posIni,posFin-posIni); }else{ m_strTraccia3="Errore Traccia 3 CDL"; } } if(bTrack1 || bTrack2 || bTrack3) sts=TRUE; else sts=FALSE; return sts; } void CDlgCardReader::CheckDataTrack1(){ m_strTraccia1.TrimRight(); m_strFormatCode=""; m_strNome=""; m_strCogn=""; m_strCodice=""; m_strServiceCode=""; m_strFormatCode=""; m_strScadenza=""; m_strPW=""; int posIni=0,posFin=0; if(m_strTraccia1.GetLength()>0){ m_strFormatCode=m_strTraccia1.GetAt(0); posIni=m_strTraccia1.Find('^'); if(posIni!=-1){ //Found m_strCodice=m_strTraccia1.Mid(1,posIni-1); posFin=m_strTraccia1.Find(' '); if(posFin!=-1){ //Found m_strCogn=m_strTraccia1.Mid(posIni+1,posFin-posIni-1); posIni=posFin+1; posFin=m_strTraccia1.Find('^',posFin); if(posFin!=-1){ m_strNome=m_strTraccia1.Mid(posIni,posFin-posIni-1); m_strScadenza=m_strTraccia1.Mid(posFin+3,2); m_strScadenza+="/"; m_strScadenza+=m_strTraccia1.Mid(posFin+1,2); m_strServiceCode=m_strTraccia1.Mid(posFin+5,3); m_strPW=m_strTraccia1.Mid(posFin+8,5); } } } } } void CDlgCardReader::OnBnClickedButton1() { if(m_bComOk==TRUE){ SetTimer(IDT_CHECK_READER,100,NULL); } } //Fine