Code to control a Traxster robot using a Wimote and Android app
Fork of BlueUSB by
Diff: hci.h
- Revision:
- 1:accdaa84fe8d
- Parent:
- 0:606b230e5b4a
diff -r 606b230e5b4a -r accdaa84fe8d hci.h --- a/hci.h Sat Apr 10 00:30:24 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,224 +0,0 @@ -/* -Copyright (c) 2010 Peter Barrett - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -#ifndef HCI_H_INCLUDED -#define HCI_H_INCLUDED - -#include "Socket.h" - -#pragma pack(1) - -#define ERR_HCI_DEVICE_NOT_FOUND -300 - -class HCI; -class HCITransport; -class BTDevice; - -typedef struct -{ - u8 addr[6]; -} BD_ADDR; - -typedef struct -{ - BD_ADDR bdaddr; - u8 pscan_rep_mode; - u8 pscan_period_mode; - u8 pscan_mode; - u8 dev_class[3]; - u16 clock_offset; -} inquiry_info; - -typedef struct -{ - u8 status; - u16 handle; - BD_ADDR bdaddr; - u8 link_type; - u8 encr_mode; -} connection_info; - -// Address struct for creating L2CAP sockets -typedef struct { - SocketAddrHdr hdr; - BD_ADDR bdaddr; - u16 psm; -} L2CAPAddr; - -#pragma pack(4) - -class BTDevice; -typedef struct -{ - public: - SocketInternal si; - BTDevice* btdevice; - u16 scid; - u16 dcid; -} L2CAPSocket; - -#define MAX_HCL_NAME_LENGTH 20 // TODO - BTDevice wants to be a multiple of 4 - -// BTDevice encapsulates individual device state -// It provides L2CAP layer sockets - -class BTDevice : public SocketHandler -{ - public: - HCITransport* _transport; - inquiry_info _info; - u16 _handle; // acl connection handle - u8 _state; // connection state - u8 _txid; - char _name[MAX_HCL_NAME_LENGTH]; - - void Init(); - - BD_ADDR* GetAddress() { return &_info.bdaddr; } - - // Called from HCI - void ACLRecv(const u8* data, int len); - - // SocketHandler - virtual int Open(SocketInternal* sock, SocketAddrHdr* addr); - virtual int Send(SocketInternal* sock, const u8* data, int len); - virtual int Close(SocketInternal* sock); - -private: - L2CAPSocket* SCIDToSocket(int scid); - int Send(const u8* data, int len); - int Send(u8 c, u8 id, u16* params, int count); - int Connect(int scid, int psm); - int Disconnect(int scid, int dcid); - int ConfigureRequest(int dcid); - int ConfigureResponse(u8 rxid, int dcid); - int DisconnectResponse(u8 rxid, int scid, int dcid); - void Control(const u8* data, int len); -}; - -enum HCI_CALLBACK_EVENT -{ - CALLBACK_NONE, - CALLBACK_READY, - CALLBACK_INQUIRY_RESULT, - CALLBACK_INQUIRY_DONE, - CALLBACK_REMOTE_NAME, - CALLBACK_CONNECTION_COMPLETE, - CALLBACK_CONNECTION_FAILED -}; - -// L2CAP Protocol/Service Multiplexor (PSM) values - -#define L2CAP_PSM_ANY 0x0000 /* Any/Invalid PSM */ -#define L2CAP_PSM_SDP 0x0001 /* Service Discovery Protocol */ -#define L2CAP_PSM_RFCOMM 0x0003 /* RFCOMM protocol */ -#define L2CAP_PSM_TCP 0x0005 /* Telephony Control Protocol */ -#define L2CAP_PSM_TCS 0x0007 /* TCS cordless */ -#define L2CAP_PSM_BNEP 0x000f /* Bluetooth Network Encapsulation Protocol*/ -#define L2CAP_PSM_HID_CNTL 0x0011 /* HID Control */ -#define L2CAP_PSM_HID_INTR 0x0013 /* HID Interrupt */ -#define L2CAP_PSM_ESDP 0x0015 /* Extended Service Discovery Profile */ -#define L2CAP_PSM_AVCTP 0x0017 /* Audio/Visual Control Transport Protocol */ -#define L2CAP_PSM_AVDTP 0x0019 /* Audio/Visual Distribution */ - -// Callback from inquiry -typedef int (*HCICallback)(HCI* hci, HCI_CALLBACK_EVENT evt, const u8* data, int len); - -#define MAX_BTDEVICES 8 - -class HCITransport; -class HCI : public SocketHandler -{ - HCITransport* _transport; - HCICallback _callback; - BD_ADDR _localAddr; - - BTDevice _devices[MAX_BTDEVICES]; - int _deviceCount; - - int _acl_mtu; - int _acl_max_pkt; - int _sco_mtu; - int _sco_max_pkt; - - int _state; - - public: - - // Open a local adapter - int Open(HCITransport* transport, HCICallback callback); - - // Return list of discovered addreses - int GetDevices(BTDevice** devices, int maxDevices); - - // Lookup a device by address or handle - BTDevice* Find(const BD_ADDR* addr); - BTDevice* Find(int handle); - - // Disconnect from a remote device - int Disconnect(const BD_ADDR* addr); - int DisconnectAll(); - - // see what devies are in the system - int Inquiry(int duration = 10); - - // get a name, delivered in callback - int RemoteNameRequest(const BD_ADDR* addr); - - // Connect to a remote device - int CreateConnection(const BD_ADDR* remoteAddr); - - bool Busy(); - - // called from transport - void HCIRecv(const u8* data, int len); - - // called from transport - void ACLRecv(const u8* data, int len); - - // SocketHandler methods for maintaining L2CAP sockets - virtual int Open(SocketInternal* sock, SocketAddrHdr* addr); - virtual int Send(SocketInternal* sock, const u8* data, int len); - virtual int Close(SocketInternal* sock); - - private: - void InquiryResult(const inquiry_info* info); - void RemoteName(const BD_ADDR* addr, const char* name); - void ConnectComplete(const connection_info* info); - void DisconnectComplete(int handle); - int SendCmd(int cmd, const u8* params = 0, int len = 0); - void OnCommandComplete(int cmd, const u8* data, int len); - void Callback(HCI_CALLBACK_EVENT c, const u8* data, int len); - int PinCodeReply(const u8* data); -}; - -class HCITransport -{ -protected: - HCI* _target; -public: - void Set(HCI* target) { _target = target; }; - virtual void HCISend(const u8* data, int len) = 0; - virtual void ACLSend(const u8* data, int len) = 0; -}; - -#endif