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

// класс для работы с модулем USB2185
class CRTUSB2185 : public IRTUSB2185
{
	// функции общего назначения
	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(RTUSB2185::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 START_READ(void);
	virtual BOOL WINAPI STOP_READ(void);
	virtual BOOL WINAPI ReadData(SHORT * const lpBuffer, DWORD * const nNumberOfWordsToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped);

	// функции для работы с выводом данных из РС
	virtual BOOL WINAPI START_WRITE(void);
	virtual BOOL WINAPI STOP_WRITE(void);
	virtual BOOL WINAPI WriteData(SHORT * const lpBuffer, DWORD * const nNumberOfWordsToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped);

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

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

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

	private:
		// определение текущей версии Windows   
		DWORD GetWindowsVersion(void);
		LONG *Transform_Buffer(WORD PmPoints, LONG * const Buffer);

		// идентификатор модуля DLL
		HINSTANCE hInstance;
		// идентификатор устройства
		HANDLE hDevice;
		// флажок разрешения глобальной записи в ППЗУ
		BOOL EnableFlashWrite;
		// флажок управления записью в служебную ообласть ППЗУ модуля
		BOOL IsServiceFlashWrite;
		// структура системного ППЗУ для модуля RTUSB2185
		RTUSB2185::FLASH fi;
		// адрес начала сегмента кода в памяти программ DSP
		WORD ProgramBaseAddress;
		// адрес начала сегмента данных в памяти программ DSP
		WORD VarsBaseAddress;
		// критическая секция для потокобезопасной работы
		CRITICAL_SECTION cs;

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

		// индексы версий 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

