www.pudn.com > fbt-a3-20041206.zip > fbthci.h, change:2004-03-11,size:5575b


#ifndef _HCI_H_ 
#define _HCI_H_ 
 
#include <windows.h> 
 
#include "fbthw.h" 
#include "fbtHciDefs.h" 
 
// Number of overlapped requests to have pending in the driver 
#define HCI_NUMBER_OF_OVERLAPPED_LISTENS	MAXIMUM_WAIT_OBJECTS-1 
 
// HCI Abstraction layer 
class CHci; 
typedef struct 
{ 
	PFBT_HCI_EVENT_HEADER		pEvent; 
	DWORD						dwLength; 
	CHci						*pThis; 
 
} HCI_EVENT, *PHCI_EVENT; 
 
class CHci : public CBTHW 
{ 
public: 
	CHci(void); 
	virtual ~CHci(void); 
 
	virtual DWORD StartEventListener(void); 
	virtual DWORD StopEventListener(void); 
    virtual DWORD OnEvent(PFBT_HCI_EVENT_HEADER pEvent, DWORD Length); 
 
	static LPCTSTR GetEventText(BYTE Event); 
	static LPCTSTR GetStatusText(BYTE Status); 
	static LPCTSTR GetManufacturerName(USHORT Company); 
 
    virtual DWORD OnCommandComplete(BYTE NumHCICommandPackets, USHORT CommandOpcode, BYTE *Parameters, DWORD ParameterLength); 
    virtual DWORD OnCommandStatus(BYTE Status, BYTE NumHCICommandPackets, USHORT CommandOpcode); 
 
    virtual DWORD OnConnectionRequest(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE], ULONG ClassOfDevice[FBT_HCI_DEVICE_CLASS_SIZE], BYTE LinkType); 
    virtual DWORD OnConnectionComplete(BYTE Status, USHORT ConnectionHandle, BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE], BYTE LinkType, BYTE EncryptionMode); 
    virtual DWORD OnDisconnectionComplete(BYTE Status, USHORT ConnectionHandle, BYTE Reason); 
 
    virtual DWORD OnInquiryComplete(BYTE Status, BYTE NumResponses); 
    virtual DWORD OnInquiryResult(BYTE NumResponses, BYTE BD_ADDR[FBT_HCI_VARIABLE_SIZE][FBT_HCI_BDADDR_SIZE], BYTE PageScanRepetitionMode[FBT_HCI_VARIABLE_SIZE], BYTE PageScanPeriodMode[FBT_HCI_VARIABLE_SIZE], BYTE PageScanMode[FBT_HCI_VARIABLE_SIZE], BYTE ClassOfDevice[FBT_HCI_VARIABLE_SIZE][FBT_HCI_DEVICE_CLASS_SIZE], USHORT ClockOffset[FBT_HCI_VARIABLE_SIZE]); 
 
    virtual DWORD OnRemoteNameRequestComplete(BYTE Status, BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE], BYTE RemoteName[FBT_HCI_NAME_SIZE]); 
 
    virtual DWORD OnRoleChange(BYTE Status, BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE], BYTE Role); 
 
    virtual DWORD OnPINCodeRequest(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE]); 
 
	virtual DWORD OnLinkKeyNotification(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE], BYTE LinkKey[FBT_HCI_LINK_KEY_SIZE]); 
    virtual DWORD OnLinkKeyRequest(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE]); 
 
	virtual DWORD OnAuthenticationComplete(BYTE Status, USHORT ConnectionHandle); 
 
	virtual DWORD OnReadLocalNameComplete(BYTE Status, BYTE Name[FBT_HCI_NAME_SIZE]); 
 
    virtual DWORD OnUnknown(PFBT_HCI_EVENT_HEADER pEvent, DWORD Length); 
 
    virtual DWORD SendReset(void); 
 
    virtual DWORD SendInquiry(ULONG LAP, BYTE InquiryLength, BYTE NumResponses); 
    virtual DWORD SendInquiryCancel(void); 
 
    virtual DWORD SendReadBDADDR(void); 
 
    virtual DWORD SendWriteScanEnable(BYTE ScanEnable); 
 
    virtual DWORD SendWriteAuthenticationEnable(BYTE ScanEnable); 
 
    virtual DWORD SendSetEventFilter(BYTE FilterType, 
                                     BYTE FilterConditionType, 
                                     BYTE Condition[FBT_HCI_MAX_CONDITION_SIZE], 
									 BYTE ConditionBytes); 
 
    virtual DWORD SendReadClassOfDevice(void); 
 
    virtual DWORD SendWriteClassOfDevice(BYTE ClassOfDevice[FBT_HCI_DEVICE_CLASS_SIZE]); 
 
    virtual DWORD SendCreateConnection(BYTE		BD_ADDR[FBT_HCI_BDADDR_SIZE], 
                                       USHORT	PacketType, 
                                       BYTE		PageScanRepetitionMode, 
                                       BYTE		PageScanMode, 
                                       USHORT	ClockOffset, 
                                       BYTE		AllowRoleSwitch); 
 
    virtual DWORD SendAcceptConnectionRequest(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE], BYTE RoleSwitch); 
 
    virtual DWORD SendDisconnect(USHORT ConnectionHandle, BYTE  Reason); 
 
    virtual DWORD SendWriteLinkSupervisionTimeout(USHORT ConnectionHandle, USHORT LinkSupervisionTimeout); 
 
    virtual DWORD SendWritePageTimeout(USHORT PageTimeout); 
 
    virtual DWORD SendRemoteNameRequest(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE], BYTE PageScanRepetitionMode, BYTE PageScanMode, USHORT ClockOffset); 
 
    virtual DWORD SendReadLocalName(void); 
 
    virtual DWORD SendChangeLocalName(BYTE Name[FBT_HCI_NAME_SIZE]); 
 
	virtual DWORD SendSwitchRole(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE], BYTE Role); 
 
	virtual DWORD SendPINCodeRequestReply(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE], BYTE PINCodeLength, BYTE PINCode[FBT_HCI_PIN_CODE_SIZE]); 
	virtual DWORD SendPINCodeRequestNegativeReply(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE]); 
 
	virtual DWORD SendLinkKeyRequestReply(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE], BYTE LinkKey[FBT_HCI_LINK_KEY_SIZE]); 
	virtual DWORD SendLinkKeyRequestNegativeReply(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE]); 
 
	virtual DWORD SendReadLocalVersionInformation(void); 
 
	DWORD CompareBDADDRs(BYTE BD_ADDR1[FBT_HCI_BDADDR_SIZE], BYTE BD_ADDR2[FBT_HCI_BDADDR_SIZE]); 
 
protected: 
	friend static DWORD CALLBACK Listener(LPVOID pContext); 
	friend static DWORD EventHandler(PFBT_HCI_EVENT_HEADER pEvent, DWORD Length); 
 
	virtual DWORD SendHciCommand(PFBT_HCI_CMD_HEADER lpCommand, DWORD dwBufferSize); 
 
    DWORD SendListenForEvent(OVERLAPPED *pOverlapped, BYTE *pEventBuffer); 
 
    HANDLE	m_hStopListeningEvent; 
    HANDLE	m_hListenerReadyEvent; 
    HANDLE	m_hListenerThread; 
 
    DWORD	m_dwListenerThreadId; 
 
    OVERLAPPED  m_Overlappeds[HCI_NUMBER_OF_OVERLAPPED_LISTENS]; 
    BYTE		m_pEventBuffers[HCI_NUMBER_OF_OVERLAPPED_LISTENS][FBT_HCI_EVENT_MAX_SIZE]; 
 
}; 
 
 
#endif // _HCI_H_