⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nscdevice.h

📁 美国国家半导体公司的扫描仪芯片LM9833的驱动程序。
💻 H
字号:
/*******************************************************************************
 *	@doc
 *
 *  @module NSCDevice.h | 
 *
 *	This module contains the definition of the <o UsdNSCDevice> COM object
 *
 *  Copyright (c) National Semiconductor Corporation 1999-2000
 *  All rights reserved
 *
 ******************************************************************************/
#ifndef _NSCDevice_H__
#define _NSCDevice_H__

const int	NS_MAX_EVENTS		= 3;
const int	NS_MAX_OPEN_APPS	= 5;

/*******************************************************************************
 *	@object UsdNSCDevice | The UsdNscDevice object is a COM object class which 
 *  implements the standard STI interface IStiUsd and the custom interface 
 *	<i INonDelegatingUnknown>
 *
 *	@consumes IStiDeviceControl 
 ******************************************************************************/
class UsdNSCDevice :  public IStiUSD, public INonDelegatingUnknown
{

public:
    /*** IUnknown-like methods ***/
    STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, LPVOID * ppvObj);
    STDMETHODIMP_(ULONG) NonDelegatingAddRef();
    STDMETHODIMP_(ULONG) NonDelegatingRelease();

    /*** IUnknown methods ***/
    STDMETHODIMP QueryInterface( REFIID riid, LPVOID * ppvObj);
    STDMETHODIMP_(ULONG) AddRef( void);
    STDMETHODIMP_(ULONG) Release( void);

    /*** IStiUSD methods ***/
    STDMETHOD(Initialize) (THIS_ PSTIDEVICECONTROL pHelDcb,DWORD dwStiVersion,HKEY hParametersKey)  ;
    STDMETHOD(GetCapabilities) (THIS_ PSTI_USD_CAPS pDevCaps)  ;
    STDMETHOD(GetStatus) (THIS_ PSTI_DEVICE_STATUS pDevStatus)  ;
    STDMETHOD(DeviceReset)(THIS )  ;
    STDMETHOD(Diagnostic)(THIS_ LPDIAG pBuffer)  ;
    STDMETHOD(Escape)(THIS_ STI_RAW_CONTROL_CODE    EscapeFunction,LPVOID  lpInData,DWORD   cbInDataSize,LPVOID pOutData,DWORD dwOutDataSize,LPDWORD pdwActualData)   ;
    STDMETHOD(GetLastError) (THIS_ LPDWORD pdwLastDeviceError)  ;
    STDMETHOD(LockDevice) (THIS )  ;
    STDMETHOD(UnLockDevice) (THIS )  ;
    STDMETHOD(RawReadData)(THIS_ LPVOID lpBuffer,LPDWORD lpdwNumberOfBytes,LPOVERLAPPED lpOverlapped)  ;
    STDMETHOD(RawWriteData)(THIS_ LPVOID lpBuffer,DWORD nNumberOfBytes,LPOVERLAPPED lpOverlapped)  ;
    STDMETHOD(RawReadCommand)(THIS_ LPVOID lpBuffer,LPDWORD lpdwNumberOfBytes,LPOVERLAPPED lpOverlapped)  ;
    STDMETHOD(RawWriteCommand)(THIS_ LPVOID lpBuffer,DWORD nNumberOfBytes,LPOVERLAPPED lpOverlapped)  ;
    STDMETHOD(SetNotificationHandle)(THIS_ HANDLE hEvent)  ;
    STDMETHOD(GetNotificationData)(THIS_ LPSTINOTIFY   lpNotify)  ;
    STDMETHOD(GetLastErrorInfo) (THIS_ STI_ERROR_INFO *pLastErrorInfo);

	void LogError(char *string,DWORD ct,BYTE b0,BYTE b1,BYTE b2,BYTE b3,
		BYTE b4,HRESULT hres);

    /****  ctor & dtor    ***/
    UsdNSCDevice(LPUNKNOWN punkOuter);
    ~UsdNSCDevice();

    /**** This method is executed in the listening thread ***/
	void ListenForInterrupts();

private:
	// IUnknown Support 
    ULONG       m_cRef;
    BOOL        m_fValid;
    LPUNKNOWN   m_punkOuter;

    CRIT_SECT   m_cs;

    PSTIDEVICECONTROL   m_pDcb;

    CHAR        *m_pszDeviceNameA;
    HANDLE      m_DeviceDataHandle;
    DWORD       m_dwLastOperationError;
	HANDLE		m_hMutex;
	HANDLE		m_hPollingMutex[NS_MAX_OPEN_APPS];
	HANDLE		m_hKickStartMutex;

	// These variables are part of the event notification 
	// scheme that uses the interrupt endpoint on the device
    HANDLE      m_hSignalEvent;
    HANDLE      m_hShutdownEvent;
    HANDLE      m_hThread;
    GUID        m_guidLastEvent;
	BYTE		m_bEventMask;
	bool		m_bEventsInitialized;
	GUID		m_bEventGuidArray[NS_MAX_EVENTS];
    DWORD       m_dwDebounceTime;
	bool		m_bPolling;
	bool		m_bRemoteWakeup;
	bool		m_bWHQLTest;
	DWORD		m_dwKickStartTime;

	/*** Private Helpers ***/
	HRESULT OpenDevice(DWORD dwAccess, DWORD dwShare, SECURITY_ATTRIBUTES& sa);
	HRESULT CloseDevice();
	HRESULT GetDeviceStatus(PSTI_DEVICE_STATUS);

	DWORD   WaitForDriverEvent(LPOVERLAPPED lpOverlapped);
    DWORD   PollForDriverEvent();

	void	GenerateScannerEvent();
	GUID	GetEventGUID(BYTE bStatusRegister);
	HRESULT ReadStatusRegister(BYTE& bValue);

    void    LoadDeviceData(HKEY     hParameters);
	void	LoadEventMask(HKEY      hDeviceData);
    void    LoadDebounceTime(HKEY   hDeviceData);
    void    LoadPollingFlag(HKEY    hDeviceData);
    void    LoadRemoteWakeupFlag(HKEY   hDeviceData);
    void    LoadKickStartTime(HKEY   hDeviceData);
    
    HRESULT	ResetModeCheckAndClear();
	HRESULT DoKickStart();

    BOOL inline IsValid(VOID) {return m_fValid;}
	HRESULT		GetNscOverlappedResult(	LPOVERLAPPED lpOverlapped, 
										DWORD	dwTimeout, 
										LPDWORD lpBytesRead);

	void WriteToLog(DWORD dwType, LPWSTR  szString, ...);
protected:
	HRESULT SetRemoteWakeup(bool bEnable);
	HRESULT UsdNSCDevice::WHQLRawWriteReadTest(void);
};


#endif //_NSCDevice_H__

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -