//---------------------------------------------------------------------------
#ifndef __RTUSB3000H__
#define __RTUSB3000H__
//---------------------------------------------------------------------------
#include "rtusbapi.h"

// класс для работы с модулем USB3000
class CRTUSB3000 : public IRTUSB3000
{
	// функции общего назначения
	virtual BOOL WINAPI OpenDevice(WORD VirtualSlot);
	virtual BOOL WINAPI CloseDevice(void);
	virtual HANDLE WINAPI GetModuleHandle(void);
	virtual BOOL WINAPI GetUsbSpeed(BYTE * const UsbSpeed);
	virtual BOOL WINAPI GetModuleName(PCHAR const ModuleName);
	virtual BOOL WINAPI GetModuleSerialNumber(PCHAR const SerialNumber);
	virtual BOOL WINAPI GetAvrVersion(PCHAR const AvrVersion);
	virtual BOOL WINAPI ReleaseInstance(void);

	// функции для работы с DSP модуля
	virtual BOOL WINAPI RESET_DSP(void);
	virtual BOOL WINAPI LOAD_DSP(PCHAR const FileName);
	virtual BOOL WINAPI MODULE_TEST(void);
	virtual BOOL WINAPI GET_DSP_INFO(RTUSB3000::DSP_INFO * const DspInfo);
	virtual BOOL WINAPI SEND_COMMAND(WORD Command);

	// функции для работы с памятью DSP
	virtual BOOL WINAPI PUT_VAR_WORD(WORD Address, SHORT Data);
	virtual BOOL WINAPI GET_VAR_WORD(WORD Address, SHORT * const Data);
	virtual BOOL WINAPI PUT_DM_WORD(WORD Address, SHORT Data);
	virtual BOOL WINAPI GET_DM_WORD(WORD Address, SHORT * const Data);
	virtual BOOL WINAPI PUT_PM_WORD(WORD Address, LONG Data);
	virtual BOOL WINAPI GET_PM_WORD(WORD Address, LONG * const Data);
	virtual BOOL WINAPI PUT_DM_ARRAY(WORD BaseAddress, WORD NPoints, SHORT * const Data);
	virtual BOOL WINAPI GET_DM_ARRAY(WORD BaseAddress, WORD NPoints, SHORT * const Data);
	virtual BOOL WINAPI PUT_PM_ARRAY(WORD BaseAddress, WORD NPoints, LONG * const Data);
	virtual BOOL WINAPI GET_PM_ARRAY(WORD BaseAddress, WORD NPoints, LONG * const Data);

	// функции для работы в режиме ввода данных из модуля в РС
	virtual BOOL WINAPI GET_INPUT_PARS(RTUSB3000::INPUT_PARS * const ap);
	virtual BOOL WINAPI SET_INPUT_PARS(RTUSB3000::INPUT_PARS * const ap);
	virtual BOOL WINAPI START_READ(void);
	virtual BOOL WINAPI STOP_READ(void);
	virtual BOOL WINAPI READ_KADR(SHORT * const Data);
	virtual BOOL WINAPI READ_SAMPLE(WORD Channel, SHORT * const Sample);
	virtual BOOL WINAPI ReadData(SHORT * const lpBuffer, DWORD * const nNumberOfWordsToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped);

	// функции для работы c выводом данных из РС в модуль
	virtual BOOL WINAPI GET_OUTPUT_PARS(RTUSB3000::OUTPUT_PARS * const dp);
	virtual BOOL WINAPI SET_OUTPUT_PARS(RTUSB3000::OUTPUT_PARS * const dp);
	virtual BOOL WINAPI START_WRITE(void);
	virtual BOOL WINAPI STOP_WRITE(void);
	virtual BOOL WINAPI WRITE_SAMPLE(WORD Channel, SHORT * const Sample);
	virtual BOOL WINAPI WriteData(SHORT * const lpBuffer, DWORD * const nNumberOfWordsToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped);

	// функции для работы с ТТЛ линиями
	virtual BOOL WINAPI ENABLE_TTL_OUT(BOOL EnableTtlOut);
	virtual BOOL WINAPI TTL_OUT(WORD TtlOut);
	virtual BOOL WINAPI TTL_IN(WORD * const TtlIn);

	// функции для работы с пользовательским ППЗУ
	virtual BOOL WINAPI ENABLE_FLASH_WRITE(BOOL EnableFlashWrite);
	virtual BOOL WINAPI PUT_FLASH(RTUSB3000::FLASH * const fi);
	virtual BOOL WINAPI GET_FLASH(RTUSB3000::FLASH * const fi);

	// функция выдачи строки с последней ошибкой
	virtual int WINAPI GetLastErrorString(LPTSTR const lpBuffer, DWORD nSize);

	public:
		// коструктор
		CRTUSB3000(HINSTANCE hInst);
		// деструктор
		~CRTUSB3000();

	private:
		// определение текущей версии Windows   
		DWORD GetWindowsVersion(void);
		LONG *Transform_Buffer(WORD PmPoints, LONG * const Buffer);
		BOOL FindoutInputType(RTUSB3000::INPUT_PARS * const ap);
		BOOL ControlTableCreation(RTUSB3000::INPUT_PARS * const ap);
		WORD CalculateCrc16(BYTE *ptr, WORD NBytes);

		// идентификатор модуля DLL
		HINSTANCE hInstance;
		// идентификатор устройства
		HANDLE hDevice;
		// скорость работы USB (0 -> USB11, 1 -> USB20)
		BYTE UsbSpeed;
		// флажок разрешения глобальной записи в ППЗУ
		BOOL EnableFlashWrite;
		// флажок управления записью в служебную ообласть ППЗУ модуля
		BOOL IsServiceFlashWrite;
		// флажок разрешения выходных цифровых линий
		BOOL EnableTtlOut;
		// структура системного ППЗУ для модуля RTUSB2185
		RTUSB3000::FLASH fi;
		// структура с параметрами функционирования АЦП
		RTUSB3000::INPUT_PARS ap;
		// структура с параметрами функционирования ЦАП
		RTUSB3000::OUTPUT_PARS dp;
		// адрес начала сегмента кода с LBIOS в памяти программ
		WORD ProgramBaseAddress;
		// адрес начала сегмента блока данных в памяти программ
		WORD VarsBaseAddress;
		// критическая секция для потокобезопасной работы
		CRITICAL_SECTION cs;

		// максимальный кол-во байтов для передачи по ContolPipe
		WORD MAX_USB_BLOCK;
		// базовый индекс ошибок модуля
		WORD BASE_ERROR_ID;
		// флажок памяти данных DSP
		WORD DSP_DM;
		// флажок памяти программ DSP
		WORD DSP_PM;

		// номер последней ошибки
		WORD LastErrorNumber;

		// номера доступных пользовательских запросов для USB (vendor request)
		enum 	{ 	V_RESET_DSP,
					V_PUT_ARRAY, V_GET_ARRAY,
					V_START_READ, V_START_WRITE,
					V_COMMAND_IRQ,
					V_GET_USB_SPEED,
					V_PUT_FLASH = 8, V_GET_FLASH = 9,
					V_GET_MODULE_NAME = 11,
					V_GET_MODULE_SERIAL_NUMBER = 13
				};

		// номера доступных команд штатного драйвера DSP
		enum 	{ 	C_TEST,
					C_START_READ, C_STOP_READ, C_READ_KADR, C_READ_SAMPLE,
					C_START_WRITE, C_STOP_WRITE, C_WRITE_SAMPLE,
					C_ENABLE_TTL_OUT, C_TTL_IN, C_TTL_OUT,
					C_LAST_COMMAND
				};

		// индексы версий Windows
		enum 	{
					UNKNOWN_WINDOWS_VERSION,
					WINDOWS_32S,
					WINDOWS_95, WINDOWS_98_OR_LATER,
					WINDOWS_NT, WINDOWS_2000, WINDOWS_XP, WINDOWS_2003_SERVER, WINDOWS_VISTA
				};
};

#endif

