//---------------------------------------------------------------------------
#ifndef _BarCode_H
#define _BarCode_H
//---------------------------------------------------------------------------
#include "../ComPort.h"
#include <wx/wx.h>
#include <structs.h>
//---------------------------------------------------------------------------
//Глобальный объект для проверки данных
//extern TSimpleList<TCheckData*>* g_BarCode;

//---------------------------------------------------------------------------
class CharStringListener //Кто собирается слушать баркод должен реализовать этот класс
{
public:
	virtual void OnDataIncoming(unsigned char** data) = 0;
};
//---------------------------------------------------------------------------
//Структура для отправки данных в COM порт
struct SData
{	int id; //id пакета
	char state; //Статус пакета 0 - ждёт своей очереди 1 - отправляется 2 - отправился 3 - ошибка
	unsigned int sizeW; //Сколько байт записанно в поток
	unsigned int size;
	void* data;
};
//---------------------------------------------------------------------------
//Если bString=true то читаем из порта набор байт и генерим событие по приходу маркера конца строки иначе как пробитали в буфер так генерим...
class BarCode: public wxThread // Объект BarCode может быть только 1 смотри использование g_BarCode
{
private:
	virtual void* Entry(); ///<Функция - поток
	int m_id; //Для генерации уникального id пакета
protected:
	ComPort* cPort; ///<Объект COM порт
	~BarCode(); ///<Так как поток
	//Для информирования слушателей
	wxCriticalSection* m_crit; ///<Критическая секция для m_ListD
	wxCriticalSection* m_critW; ///<Критическая секция для m_ListW
	TSimpleList<unsigned char*>* m_ListD; ///<Список пришедших данных в виде ASCI строки (либо побайтноо если bString=false)
	TSimpleList<SData*>* m_ListW; ///<Список даных для записи в COM порт
	//Список данных которые надо отправить в COM порт

	TSimpleList<CharStringListener*>* m_ListL; ///<Список слушателей данных
	int GetNextId(){ return m_id++; };
public:
	bool bString; // bString - true то ждёт признак конца строки иначе как набор байт

	BarCode();
	bool Connect(int port,int speed);
	bool Disconnect();
	void AddListener(CharStringListener* listener);
	void RemListener(CharStringListener* listener);
	bool OnTimer(); ///<Работает в основном потоке для проверки прихода данных

	unsigned long WriteS(const void* lpBuffer,unsigned long nNumberOfBytesToWrite); //Записать данные в ком порт синхронно
};
//---------------------------------------------------------------------------
extern BarCode* g_BarCode; //Объект BarCode может быть только 1
//---------------------------------------------------------------------------
#endif
