- Update to r53061
[reactos.git] / drivers / bluetooth / fbtusb / include / fbthci.h
1 #ifndef _HCI_H_
2 #define _HCI_H_
3
4 #include <windows.h>
5
6 #include "fbthw.h"
7 #include "fbtHciDefs.h"
8
9 // Number of overlapped requests to have pending in the driver
10 #define HCI_NUMBER_OF_OVERLAPPED_LISTENS MAXIMUM_WAIT_OBJECTS-1
11
12 // HCI Abstraction layer
13 class CHci;
14 typedef struct
15 {
16 PFBT_HCI_EVENT_HEADER pEvent;
17 DWORD dwLength;
18 CHci *pThis;
19
20 } HCI_EVENT, *PHCI_EVENT;
21
22 class CHci : public CBTHW
23 {
24 public:
25 CHci(void);
26 virtual ~CHci(void);
27
28 virtual DWORD StartEventListener(void);
29 virtual DWORD StopEventListener(void);
30 virtual DWORD OnEvent(PFBT_HCI_EVENT_HEADER pEvent, DWORD Length);
31
32 static LPCTSTR GetEventText(BYTE Event);
33 static LPCTSTR GetStatusText(BYTE Status);
34 static LPCTSTR GetManufacturerName(USHORT Company);
35
36 virtual DWORD OnCommandComplete(BYTE NumHCICommandPackets, USHORT CommandOpcode, BYTE *Parameters, DWORD ParameterLength);
37 virtual DWORD OnCommandStatus(BYTE Status, BYTE NumHCICommandPackets, USHORT CommandOpcode);
38
39 virtual DWORD OnConnectionRequest(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE], ULONG ClassOfDevice[FBT_HCI_DEVICE_CLASS_SIZE], BYTE LinkType);
40 virtual DWORD OnConnectionComplete(BYTE Status, USHORT ConnectionHandle, BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE], BYTE LinkType, BYTE EncryptionMode);
41 virtual DWORD OnDisconnectionComplete(BYTE Status, USHORT ConnectionHandle, BYTE Reason);
42
43 virtual DWORD OnInquiryComplete(BYTE Status, BYTE NumResponses);
44 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]);
45
46 virtual DWORD OnRemoteNameRequestComplete(BYTE Status, BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE], BYTE RemoteName[FBT_HCI_NAME_SIZE]);
47
48 virtual DWORD OnRoleChange(BYTE Status, BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE], BYTE Role);
49
50 virtual DWORD OnPINCodeRequest(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE]);
51
52 virtual DWORD OnLinkKeyNotification(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE], BYTE LinkKey[FBT_HCI_LINK_KEY_SIZE]);
53 virtual DWORD OnLinkKeyRequest(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE]);
54
55 virtual DWORD OnAuthenticationComplete(BYTE Status, USHORT ConnectionHandle);
56
57 virtual DWORD OnReadLocalNameComplete(BYTE Status, BYTE Name[FBT_HCI_NAME_SIZE]);
58
59 virtual DWORD OnUnknown(PFBT_HCI_EVENT_HEADER pEvent, DWORD Length);
60
61 virtual DWORD SendReset(void);
62
63 virtual DWORD SendInquiry(ULONG LAP, BYTE InquiryLength, BYTE NumResponses);
64 virtual DWORD SendInquiryCancel(void);
65
66 virtual DWORD SendReadBDADDR(void);
67
68 virtual DWORD SendWriteScanEnable(BYTE ScanEnable);
69
70 virtual DWORD SendWriteAuthenticationEnable(BYTE ScanEnable);
71
72 virtual DWORD SendSetEventFilter(BYTE FilterType,
73 BYTE FilterConditionType,
74 BYTE Condition[FBT_HCI_MAX_CONDITION_SIZE],
75 BYTE ConditionBytes);
76
77 virtual DWORD SendReadClassOfDevice(void);
78
79 virtual DWORD SendWriteClassOfDevice(BYTE ClassOfDevice[FBT_HCI_DEVICE_CLASS_SIZE]);
80
81 virtual DWORD SendCreateConnection(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE],
82 USHORT PacketType,
83 BYTE PageScanRepetitionMode,
84 BYTE PageScanMode,
85 USHORT ClockOffset,
86 BYTE AllowRoleSwitch);
87
88 virtual DWORD SendAcceptConnectionRequest(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE], BYTE RoleSwitch);
89
90 virtual DWORD SendDisconnect(USHORT ConnectionHandle, BYTE Reason);
91
92 virtual DWORD SendWriteLinkSupervisionTimeout(USHORT ConnectionHandle, USHORT LinkSupervisionTimeout);
93
94 virtual DWORD SendWritePageTimeout(USHORT PageTimeout);
95
96 virtual DWORD SendRemoteNameRequest(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE], BYTE PageScanRepetitionMode, BYTE PageScanMode, USHORT ClockOffset);
97
98 virtual DWORD SendReadLocalName(void);
99
100 virtual DWORD SendChangeLocalName(BYTE Name[FBT_HCI_NAME_SIZE]);
101
102 virtual DWORD SendSwitchRole(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE], BYTE Role);
103
104 virtual DWORD SendPINCodeRequestReply(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE], BYTE PINCodeLength, BYTE PINCode[FBT_HCI_PIN_CODE_SIZE]);
105 virtual DWORD SendPINCodeRequestNegativeReply(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE]);
106
107 virtual DWORD SendLinkKeyRequestReply(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE], BYTE LinkKey[FBT_HCI_LINK_KEY_SIZE]);
108 virtual DWORD SendLinkKeyRequestNegativeReply(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE]);
109
110 virtual DWORD SendReadLocalVersionInformation(void);
111
112 DWORD CompareBDADDRs(BYTE BD_ADDR1[FBT_HCI_BDADDR_SIZE], BYTE BD_ADDR2[FBT_HCI_BDADDR_SIZE]);
113
114 protected:
115 friend static DWORD CALLBACK Listener(LPVOID pContext);
116 friend static DWORD EventHandler(PFBT_HCI_EVENT_HEADER pEvent, DWORD Length);
117
118 virtual DWORD SendHciCommand(PFBT_HCI_CMD_HEADER lpCommand, DWORD dwBufferSize);
119
120 DWORD SendListenForEvent(OVERLAPPED *pOverlapped, BYTE *pEventBuffer);
121
122 HANDLE m_hStopListeningEvent;
123 HANDLE m_hListenerReadyEvent;
124 HANDLE m_hListenerThread;
125
126 DWORD m_dwListenerThreadId;
127
128 OVERLAPPED m_Overlappeds[HCI_NUMBER_OF_OVERLAPPED_LISTENS];
129 BYTE m_pEventBuffers[HCI_NUMBER_OF_OVERLAPPED_LISTENS][FBT_HCI_EVENT_MAX_SIZE];
130
131 };
132
133
134 #endif // _HCI_H_