Files
Tools_CPP/devices/BarCodes/BarCode.cpp
2024-11-01 12:23:13 +05:00

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;
}
//------------------------------------------------------------------------------