//---------------------------------------------------------------------------
#ifndef ValidatorH
#define ValidatorH
//---------------------------------------------------------------------------
#include "../ComPort.h"
#define HAVE_STRUCT_TIMESPEC
#include <pthread.h>
#include "structs.h"
//#include "ValidatorThread.h"
//---------------------------------------------------------------------------
//Список команд валидатору
#define fcRESET 0x30;// Command for Bill - to - Bill unit to self - reset ALL
#define fcGET_STATUS 0x31;// Request for Bill - to - Bill unit set - up status IDLING, DISABLED
#define fcSET_SECURITY 0x32;//Sets Bill - to - Bill unit Security Mode. Command is followed by set - up data.See command format INITIALIZE, DISABLED
#define fcPOLL 0x33; //Request for Bill - to - Bill unit activity Status ALL
#define fcENABLE_BILL_TYPES 0x34; //Indicates Bill Type enable or disable. Command is followed by set - up data.See command format IDLING, ACCEPTING,REJECTING, ESCROW,HOLDING, STACKING,RETURNING, DISABLED
#define fcSTACK 0x35; //Sent by Controller to stack a bill in escrow to drop cassette or to one of the recycling cassettes ESCROW, HOLDING
#define fcRETURN 0x36; //Sent by Controller to return a bill in escrow ESCROW, HOLDING
#define fcIDENTIFICATION 0x37; //Request for Model, Serial Number, Country ISO code, Asset Number POWER UP, INITIALISE, DISABLED, IDLING
#define fcHOLD 0x38; //Command for holding a bill in Escrow state ESCROW, HOLDING

#define fcSET_BARCODE_PARAMETERS 0x39; // Command for settings the barcode format and number of characters INITIALIZE, DISABLED
#define fcEXTRACT_BARCODE_DATA 0x3A; // Command for retrieving barcode data if barcode coupon is found.If this command is sent when barcode coupon is not found the Bill Validator returns ILLEGAL COMMAND response. ESCROW, PACKED, IDLING, DISABLED 
#define fcRECYCLING_CASSETTE_STATUS 0x3B; // Request for Bill - to - Bill unit recycling cassette status IDLING, DISABLED, ESCROW
#define fcDISPENSE 0x3C; // Command to dispense bill(s) DISABLED
#define fcUNLOAD 0x3D; // Command to unload bills from recycling cassette(s) to drop cassette DISABLED 
#define fcEXTENDED_IDENTIFICATION 0x3E; // Request for Model, Serial Number, Software Version of Bill - to - Bill unit and its subunits, Country ISO code, Asset Number DISABLED, IDLING 
#define fcSET_RECYCLING_CASSETTE_TYPE 0x40; // Assigns recycling cassettes to bill type DISABLED 
#define fcGET_BILL_TABLE 0x41; // Request for bill type description IDLING, DISABLED
#define fcDOWNLOAD 0x50; // Command for transition to download mode. Please refer to CCNET Document 2 for details. DISABLED, FAILURE, DROP CASSETTE REMOVED 
#define fcGET_CRC32_OF_THE_CODE 0x51; // Request for Bill Validator’s firmware CRC32. POWER UP, INITIALIZE, DISABLED, FAILURE
#define fcMODULE_DOWNLOAD 0x52; // Command to enter an internal module update mode.Please refer to CCNET Document 2 for details. DISABLED 
#define fcMODULE_IDENTIFICATION_REQUEST 0x53; // Request serial numbers of all intelligent modules DISABLED, IDLING
#define fcREQUEST_STATISTICS 0x60; // Command for retrieving full information about acceptance performance.Please refer to CCNET Document 3 for details. DISABLED
#define fcREAL_TIME_CLOCK 0x62; // Read or initialize internal Real - Time Clock.DISABLED
#define fcPOWER_RECOVERY 0x66; // Request whether there was a power cut and perform credit recovery DISABLED
#define fcEMPTY_DISPENSER 0x67; // Dispense all bills remaining in the dispenser after power cut. POWER CUT WHILE DISPENSING
#define fcSET_OPTIONS 0x68; // Set various Bill - To - Bill options INITIALIZE, DISABLED
#define fcGET_OPTIONS 0x69; // Set various Bill - To - Bill options INITIALIZE, DISABLED EXTENDED CASSETTE
#define fcSTATUS 0x70; // Extended recycling cassette status request DISABLED
//---------------------------------------------------------------------------
struct BillType
{
	int val; //Номинал купюры
	char country[3]; //Код страны
};
//---------------------------------------------------------------------------
int addZero(int val,int cnt); //Добавить нули к цифре
//---------------------------------------------------------------------------
class Validator
{
private:
	unsigned char ReadAr[255];
protected:
	//int Pay;

	bool CheckOnCRC(unsigned char* lpBuffer,unsigned long nSize);

	//Нижэ всё для отдельного потока
	bool execute_thread = false; //По умолчанию поток не работает
	pthread_t m_threadid;
	static void *thread_func(void *d);
	pthread_mutex_t m_mutex;


	TSimpleList2<int> m_pays; //для сбора всех оплат из потока (в мютексе)
	int m_payState; //Текущее состояние валидатора (в мютексе)

	int getTHPay(int &state); //Вызывается в отдельном потоке
	void endPay(); //Вызывается в отдельном потоке при завершении оплаты
public:
	bool m_testmode; //Не генерить ошибок и не возвращять что операция произошла неудачно

	ComPort* cPort; //К какому КОМ порту подключён
	bool bNominals; //Получили хоть 1 раз номиналы купюп
	BillType bt[24]; //Список номиналов купюр
	std::string BatchNumber, SerialNumber; //Номер партии и серийный

	Validator();
	virtual ~Validator();
	//---------------------------------------------------------------------------
	bool OpenCOMPort(std::string ComNumber, int BaudRate);
	bool SendCommand(std::string req, std::string &ans);
	bool Start(); //проинициализировать валидатор

	bool Reset(); //Перезагрузить валидатор
	bool GetStatus(); //Получить статус валидатора
	bool SetEnableBillTypes(bool enable); //Установить какие купюры разрешены к приёму


	bool getSerialNumber(); //Получить номер партии и серийник
	bool getNominals(); //Получить номиналы прошитых купюр
	
	bool startPay(); //Стартуем поток оплаты
	int getPay(); //Получить значение из нокопившегося списка оплат, значение удаляется из списка 
	int getPayState(); //Получить текущее состояние платежа 0 - купюра не распознаётся 1 - Купюра в данный момент распознаётся
	bool stopPay(); //Стопим поток оплаты
	

	int GetState(); //Если 0 то всё в порядке
	std::string GetStatusDescription(char StatusCode); //Описание статуса
};
//---------------------------------------------------------------------------
extern Validator* validator;
//---------------------------------------------------------------------------
#endif

