237 lines
6.4 KiB
C++
237 lines
6.4 KiB
C++
/***************************************************************
|
|
* Name: BarCode.cpp
|
|
* Purpose: Code for Application Frame
|
|
* Author: Igor I (info@tiptopcity.com)
|
|
* Created: 2010-12-01
|
|
* Copyright: Igor I (www.tiptopcity.com)
|
|
* License: Commercial
|
|
**************************************************************/
|
|
|
|
//#include "stdafx.h"
|
|
#include "BarCode.h"
|
|
//#include <wx/dcsvg.h>
|
|
|
|
/*
|
|
#include <api/setupapi.h>
|
|
extern "C"
|
|
{
|
|
#include <api/hidsdi.h>
|
|
}
|
|
/**/
|
|
//#include "hidsdi.h" //Ýòî åñëè ñ÷èòûâàòåëü øòðèõ êîäîâ êàê HID óñòðîéñòâî windows â ïàïêå C:\WinDDK\7600.16385.1\inc\
|
|
|
|
//------------------------------------------------------------------------------
|
|
//TSimpleList<TCheckData*>* g_BarCode=NULL;
|
|
BarCode* g_BarCode=NULL;
|
|
//------------------------------------------------------------------------------
|
|
BarCode::BarCode()
|
|
{
|
|
m_id=0;
|
|
bString = true;
|
|
|
|
m_crit = new wxCriticalSection(); //Äëÿ ñèíõðîíèçàöèè
|
|
m_ListD = new TSimpleList<unsigned char*>(5,false);
|
|
|
|
m_critW = new wxCriticalSection(); //Äëÿ ñèíõðîíèçàöèè çàïèñè â ïîòîê
|
|
m_ListW = new TSimpleList<SData*>(5,false); //Ñïèñîê ïàêåòîâ êîòîðûõ íàäî çàïèñàòü â ïîòîê
|
|
|
|
m_ListL = new TSimpleList<CharStringListener*>(5,false);
|
|
|
|
cPort=new ComPort();
|
|
|
|
if(g_BarCode!=NULL) g_BarCode->Disconnect();
|
|
g_BarCode=this;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
BarCode::~BarCode()
|
|
{
|
|
//Ñëåäèì çà ãëîáàëüíûì îáúåêòîì.
|
|
if(g_BarCode==this) g_BarCode=NULL;
|
|
/*if(g_BarCode!=NULL && g_BarCode->count()==0)
|
|
{ delete g_BarCode;
|
|
g_BarCode=NULL;
|
|
}*/
|
|
|
|
//×èñòèì è óäàëÿåì ñïèñîê äëÿ çàïèñè ñ ïîòîê
|
|
for(unsigned int i=0;i<m_ListD->count();i++)
|
|
{ delete m_ListW->get(i)->data;
|
|
delete m_ListW->get(i);
|
|
}
|
|
delete m_ListW;
|
|
|
|
for(unsigned int i=0;i<m_ListD->count();i++) delete m_ListD->get(i); //Íå âîñòðåáîâàííûå óäàëÿåì åñëè åñòü
|
|
delete m_ListD; m_ListD=NULL;
|
|
delete m_ListL; m_ListL=NULL;
|
|
delete cPort; cPort=NULL;
|
|
delete m_crit; m_crit=NULL;
|
|
delete m_ListW; m_ListW=NULL;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
//Äîáàâèòü ñëóøàòåëÿ âûáîðà
|
|
void BarCode::AddListener(CharStringListener* listener)
|
|
{ //m_crit->Enter();
|
|
if(m_ListL!=NULL && listener!=NULL)
|
|
m_ListL->add(listener);
|
|
//m_crit->Leave();
|
|
};
|
|
//------------------------------------------------------------------------------
|
|
//Óäàëèòü ñëêøàòåëÿ âûáîðà
|
|
void BarCode::RemListener(CharStringListener* listener)
|
|
{ //m_crit->Enter();
|
|
if(m_ListL!=NULL && listener!=NULL)
|
|
m_ListL->del(listener);
|
|
//m_crit->Leave();
|
|
};
|
|
//------------------------------------------------------------------------------
|
|
bool BarCode::Connect(int port,int speed)
|
|
{
|
|
cPort->BaudRate=speed;
|
|
if (cPort->Open(port))
|
|
{
|
|
if(cPort->Setup(0))
|
|
{
|
|
if(Create()==wxTHREAD_NO_ERROR)
|
|
{ Run();
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
///<Îòñîåäåíèòüñÿ îò ïîðòà è óäàëèòü ïîòîê
|
|
bool BarCode::Disconnect()
|
|
{ return cPort->Close();
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
//Ôóíêöèÿ - ïîòîê ñëóæèò äëÿ ïðè¸ìà è îòïðàâêì äàííûõ
|
|
void* BarCode::Entry()
|
|
{
|
|
unsigned char* ch=new unsigned char[255]; //Áóôåð
|
|
unsigned int pos=0; //Ïîçèöèÿ â áóôåðå
|
|
while(cPort->bOpen)
|
|
{
|
|
if(bString)
|
|
{
|
|
//×èòàåì ïîáàéòíî äî çàäàííîãî ïðèçíàêà
|
|
if(cPort->Read(&ch[pos],1)>0)
|
|
{
|
|
if(ch[pos]==13 || ch[pos]==10 || pos==254)
|
|
{ if(pos>0)
|
|
{
|
|
ch[pos]=0; //Ñòàâèì ïðèçíàê êîíöà ñòðîêè
|
|
m_ListD->add(ch);
|
|
ch=new unsigned char[255];
|
|
pos=0;
|
|
}
|
|
}else
|
|
pos++;
|
|
}
|
|
}else
|
|
{
|
|
//Êàê ïðî÷èòàëè 1 áàéò òàê ñ ðàçó è äîáàâëÿåì â ñïèñîê ñîáûòèé
|
|
if(cPort->Read(ch,1)>0)
|
|
{
|
|
ch[1]=0; //Ñòàâèì ïðèçíàê êîíöà ñòðîêè
|
|
m_ListD->add(ch);
|
|
ch=new unsigned char[255];
|
|
pos=0;
|
|
}
|
|
}
|
|
|
|
//Åñëè åñòü äàííûå äëÿ îòïðàâêè îòïðàâëÿåì èõ â ïîòîê
|
|
m_critW->Enter();
|
|
for(unsigned int i=0;i<m_ListW->count();i++)
|
|
{
|
|
if(m_ListW->get(i)->state==0) //Òå êîòîðûå æäóò îòïðàâêè
|
|
{
|
|
m_ListW->get(i)->sizeW = cPort->Write(m_ListW->get(i)->data,m_ListW->get(i)->size);
|
|
m_ListW->get(i)->state = m_ListW->get(i)->sizeW == m_ListW->get(i)->size ? 2 : 3; // 2 - ok, 3 - error (Íåò ñîñòîîÿíèÿ 1 òàê êàê îòïðàâëÿåì áëîêîì)
|
|
}
|
|
}
|
|
m_critW->Leave();
|
|
|
|
//wxThread::Sleep(100); //Ðàññêîìåíòèðîâàòü åñëè ïîëíîñòüþ â àñèíõðîííîì ðåæèìå êîì ïîðò
|
|
}
|
|
delete ch;
|
|
return NULL;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
//Ðàáîòàåò â îñíîâíîì ïîòîêå äëÿ ïðîâåðêè ïðèõîäà äàííûõ (ñàì íå âûçâàåòñÿ íàäî èç âíåøíåé ïðîãè ïðîâåðÿòü)
|
|
bool BarCode::OnTimer()
|
|
{
|
|
if(m_ListD==NULL || m_ListL==NULL) return false;
|
|
unsigned char *ch;
|
|
unsigned char **p; //Óêàçàòåëü íà óêàçàòåëü ÷òîá ñëóøàòåëè ìîãëè çàáðàòü ñåáå.
|
|
p=&ch;
|
|
do
|
|
{ ch=NULL;
|
|
m_crit->Enter();
|
|
if(m_ListD->count()>0)
|
|
{ ch=m_ListD->get(0);
|
|
m_ListD->del((unsigned int)0); //Óäàëÿåì èç ñïèñêà
|
|
}
|
|
m_crit->Leave();
|
|
//Èíôîðìèðóåì ñëóøàòåëåé î íîâîé òàáëèöå
|
|
if(ch!=NULL)
|
|
{ m_crit->Enter();
|
|
for(unsigned int i=0;i<m_ListL->count();i++)
|
|
{
|
|
m_ListL->get(i)->OnDataIncoming(p);
|
|
if(ch!=NULL) break; //Êòî-òî âîñïîëüçîâàëñÿ...
|
|
}
|
|
m_crit->Leave();
|
|
//Åñëè íèêîìó íå ïîíàäîáèëàñü óäàëÿåì òàáëèöó
|
|
if(ch!=NULL) {delete ch; ch=NULL;}
|
|
}
|
|
}
|
|
while(ch!=NULL);
|
|
return true;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
//Ñèíõðîííî çàïèñàòü äàííûå â ïîòîê
|
|
unsigned long BarCode::WriteS(const void* lpBuffer,unsigned long nNumberOfBytesToWrite)
|
|
{
|
|
int id=GetNextId();
|
|
|
|
SData* d=new SData;
|
|
d->id=id;
|
|
d->sizeW=0;
|
|
d->state=0;
|
|
d->data=new char[nNumberOfBytesToWrite];
|
|
|
|
memcpy(d->data,lpBuffer,nNumberOfBytesToWrite); //Êîïèðóåì äàííûå (TODO ìîæíî è íå êîïèðîâàòü òàê êàê çäåñü ýìóëÿöèÿ ñèíõðîííîñòè)
|
|
d->size=nNumberOfBytesToWrite;
|
|
|
|
m_critW->Enter();
|
|
m_ListW->add(d);
|
|
m_critW->Leave();
|
|
|
|
//Æä¸ì îòâåò òî ÷òî âñå äàííûå çàïèñàííû â ïîðò òîåñòü â ïàêåòå ïîìåíÿëñÿ ñòàòóñ
|
|
unsigned long size=0;
|
|
for(int i=0;i<600;i++) //Ìàêñ ìèíóòó æä¸ì ñòàòóñ...
|
|
{
|
|
SData* rez=NULL;
|
|
m_critW->Enter();
|
|
for(unsigned int j=0;j<m_ListW->count();j++)
|
|
{
|
|
if(m_ListW->get(j)->id==id && (m_ListW->get(j)->state==2 || m_ListW->get(j)->state==3))
|
|
{
|
|
rez=m_ListW->get(j);
|
|
m_ListW->del(j);
|
|
break;
|
|
}
|
|
}
|
|
m_critW->Leave();
|
|
if(rez!=NULL)
|
|
{
|
|
size=rez->sizeW;
|
|
delete rez->data;
|
|
delete rez;
|
|
break;
|
|
}
|
|
wxThread::Sleep(100);
|
|
}
|
|
return size;
|
|
}
|
|
//------------------------------------------------------------------------------
|