A USB/360deg Rotational device, communicating via blue-tooth, test code

Dependencies:   FatFileSystem mbed

Committer:
lolpcc
Date:
Fri Dec 21 11:37:38 2012 +0000
Revision:
0:87da38093be9
Used to test the Lazy Susan at work, hence the A2D code in Utils.cpp

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lolpcc 0:87da38093be9 1 /*
lolpcc 0:87da38093be9 2 Copyright (c) 2010 Peter Barrett
lolpcc 0:87da38093be9 3
lolpcc 0:87da38093be9 4 Permission is hereby granted, free of charge, to any person obtaining a copy
lolpcc 0:87da38093be9 5 of this software and associated documentation files (the "Software"), to deal
lolpcc 0:87da38093be9 6 in the Software without restriction, including without limitation the rights
lolpcc 0:87da38093be9 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
lolpcc 0:87da38093be9 8 copies of the Software, and to permit persons to whom the Software is
lolpcc 0:87da38093be9 9 furnished to do so, subject to the following conditions:
lolpcc 0:87da38093be9 10
lolpcc 0:87da38093be9 11 The above copyright notice and this permission notice shall be included in
lolpcc 0:87da38093be9 12 all copies or substantial portions of the Software.
lolpcc 0:87da38093be9 13
lolpcc 0:87da38093be9 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
lolpcc 0:87da38093be9 15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
lolpcc 0:87da38093be9 16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
lolpcc 0:87da38093be9 17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
lolpcc 0:87da38093be9 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
lolpcc 0:87da38093be9 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
lolpcc 0:87da38093be9 20 THE SOFTWARE.
lolpcc 0:87da38093be9 21 */
lolpcc 0:87da38093be9 22
lolpcc 0:87da38093be9 23 #ifndef HCI_H_INCLUDED
lolpcc 0:87da38093be9 24 #define HCI_H_INCLUDED
lolpcc 0:87da38093be9 25
lolpcc 0:87da38093be9 26 #include "Socket.h"
lolpcc 0:87da38093be9 27
lolpcc 0:87da38093be9 28 #pragma pack(1)
lolpcc 0:87da38093be9 29
lolpcc 0:87da38093be9 30 #define ERR_HCI_DEVICE_NOT_FOUND -300
lolpcc 0:87da38093be9 31
lolpcc 0:87da38093be9 32 class HCI;
lolpcc 0:87da38093be9 33 class HCITransport;
lolpcc 0:87da38093be9 34 class BTDevice;
lolpcc 0:87da38093be9 35
lolpcc 0:87da38093be9 36 typedef struct
lolpcc 0:87da38093be9 37 {
lolpcc 0:87da38093be9 38 u8 addr[6];
lolpcc 0:87da38093be9 39 } BD_ADDR;
lolpcc 0:87da38093be9 40
lolpcc 0:87da38093be9 41 typedef struct
lolpcc 0:87da38093be9 42 {
lolpcc 0:87da38093be9 43 BD_ADDR bdaddr;
lolpcc 0:87da38093be9 44 u8 pscan_rep_mode;
lolpcc 0:87da38093be9 45 u8 pscan_period_mode;
lolpcc 0:87da38093be9 46 u8 pscan_mode;
lolpcc 0:87da38093be9 47 u8 dev_class[3];
lolpcc 0:87da38093be9 48 u16 clock_offset;
lolpcc 0:87da38093be9 49 } inquiry_info;
lolpcc 0:87da38093be9 50
lolpcc 0:87da38093be9 51 typedef struct
lolpcc 0:87da38093be9 52 {
lolpcc 0:87da38093be9 53 u8 status;
lolpcc 0:87da38093be9 54 u16 handle;
lolpcc 0:87da38093be9 55 BD_ADDR bdaddr;
lolpcc 0:87da38093be9 56 u8 link_type;
lolpcc 0:87da38093be9 57 u8 encr_mode;
lolpcc 0:87da38093be9 58 } connection_info;
lolpcc 0:87da38093be9 59
lolpcc 0:87da38093be9 60 // Address struct for creating L2CAP sockets
lolpcc 0:87da38093be9 61 typedef struct {
lolpcc 0:87da38093be9 62 SocketAddrHdr hdr;
lolpcc 0:87da38093be9 63 BD_ADDR bdaddr;
lolpcc 0:87da38093be9 64 u16 psm;
lolpcc 0:87da38093be9 65 } L2CAPAddr;
lolpcc 0:87da38093be9 66
lolpcc 0:87da38093be9 67 #pragma pack(4)
lolpcc 0:87da38093be9 68
lolpcc 0:87da38093be9 69 class BTDevice;
lolpcc 0:87da38093be9 70 typedef struct
lolpcc 0:87da38093be9 71 {
lolpcc 0:87da38093be9 72 public:
lolpcc 0:87da38093be9 73 SocketInternal si;
lolpcc 0:87da38093be9 74 BTDevice* btdevice;
lolpcc 0:87da38093be9 75 u16 scid;
lolpcc 0:87da38093be9 76 u16 dcid;
lolpcc 0:87da38093be9 77 } L2CAPSocket;
lolpcc 0:87da38093be9 78
lolpcc 0:87da38093be9 79 #define MAX_HCL_NAME_LENGTH 20 // TODO - BTDevice wants to be a multiple of 4
lolpcc 0:87da38093be9 80
lolpcc 0:87da38093be9 81 // BTDevice encapsulates individual device state
lolpcc 0:87da38093be9 82 // It provides L2CAP layer sockets
lolpcc 0:87da38093be9 83
lolpcc 0:87da38093be9 84 class BTDevice : public SocketHandler
lolpcc 0:87da38093be9 85 {
lolpcc 0:87da38093be9 86 public:
lolpcc 0:87da38093be9 87 HCITransport* _transport;
lolpcc 0:87da38093be9 88 inquiry_info _info;
lolpcc 0:87da38093be9 89 u16 _handle; // acl connection handle
lolpcc 0:87da38093be9 90 u8 _state; // connection state
lolpcc 0:87da38093be9 91 u8 _txid;
lolpcc 0:87da38093be9 92 char _name[MAX_HCL_NAME_LENGTH];
lolpcc 0:87da38093be9 93
lolpcc 0:87da38093be9 94 void Init();
lolpcc 0:87da38093be9 95
lolpcc 0:87da38093be9 96 BD_ADDR* GetAddress() { return &_info.bdaddr; }
lolpcc 0:87da38093be9 97
lolpcc 0:87da38093be9 98 // Called from HCI
lolpcc 0:87da38093be9 99 void ACLRecv(const u8* data, int len);
lolpcc 0:87da38093be9 100
lolpcc 0:87da38093be9 101 // SocketHandler
lolpcc 0:87da38093be9 102 virtual int Open(SocketInternal* sock, SocketAddrHdr* addr);
lolpcc 0:87da38093be9 103 virtual int Send(SocketInternal* sock, const u8* data, int len);
lolpcc 0:87da38093be9 104 virtual int Close(SocketInternal* sock);
lolpcc 0:87da38093be9 105
lolpcc 0:87da38093be9 106 private:
lolpcc 0:87da38093be9 107 L2CAPSocket* SCIDToSocket(int scid);
lolpcc 0:87da38093be9 108 int Send(const u8* data, int len);
lolpcc 0:87da38093be9 109 int Send(u8 c, u8 id, u16* params, int count);
lolpcc 0:87da38093be9 110 int Connect(int scid, int psm);
lolpcc 0:87da38093be9 111 int Disconnect(int scid, int dcid);
lolpcc 0:87da38093be9 112 int ConfigureRequest(int dcid);
lolpcc 0:87da38093be9 113 int ConfigureResponse(u8 rxid, int dcid);
lolpcc 0:87da38093be9 114 int DisconnectResponse(u8 rxid, int scid, int dcid);
lolpcc 0:87da38093be9 115 void Control(const u8* data, int len);
lolpcc 0:87da38093be9 116 };
lolpcc 0:87da38093be9 117
lolpcc 0:87da38093be9 118 enum HCI_CALLBACK_EVENT
lolpcc 0:87da38093be9 119 {
lolpcc 0:87da38093be9 120 CALLBACK_NONE,
lolpcc 0:87da38093be9 121 CALLBACK_READY,
lolpcc 0:87da38093be9 122 CALLBACK_INQUIRY_RESULT,
lolpcc 0:87da38093be9 123 CALLBACK_INQUIRY_DONE,
lolpcc 0:87da38093be9 124 CALLBACK_REMOTE_NAME,
lolpcc 0:87da38093be9 125 CALLBACK_CONNECTION_COMPLETE,
lolpcc 0:87da38093be9 126 CALLBACK_CONNECTION_FAILED
lolpcc 0:87da38093be9 127 };
lolpcc 0:87da38093be9 128
lolpcc 0:87da38093be9 129 // L2CAP Protocol/Service Multiplexor (PSM) values
lolpcc 0:87da38093be9 130
lolpcc 0:87da38093be9 131 #define L2CAP_PSM_ANY 0x0000 /* Any/Invalid PSM */
lolpcc 0:87da38093be9 132 #define L2CAP_PSM_SDP 0x0001 /* Service Discovery Protocol */
lolpcc 0:87da38093be9 133 #define L2CAP_PSM_RFCOMM 0x0003 /* RFCOMM protocol */
lolpcc 0:87da38093be9 134 #define L2CAP_PSM_TCP 0x0005 /* Telephony Control Protocol */
lolpcc 0:87da38093be9 135 #define L2CAP_PSM_TCS 0x0007 /* TCS cordless */
lolpcc 0:87da38093be9 136 #define L2CAP_PSM_BNEP 0x000f /* Bluetooth Network Encapsulation Protocol*/
lolpcc 0:87da38093be9 137 #define L2CAP_PSM_HID_CNTL 0x0011 /* HID Control */
lolpcc 0:87da38093be9 138 #define L2CAP_PSM_HID_INTR 0x0013 /* HID Interrupt */
lolpcc 0:87da38093be9 139 #define L2CAP_PSM_ESDP 0x0015 /* Extended Service Discovery Profile */
lolpcc 0:87da38093be9 140 #define L2CAP_PSM_AVCTP 0x0017 /* Audio/Visual Control Transport Protocol */
lolpcc 0:87da38093be9 141 #define L2CAP_PSM_AVDTP 0x0019 /* Audio/Visual Distribution */
lolpcc 0:87da38093be9 142
lolpcc 0:87da38093be9 143 // Callback from inquiry
lolpcc 0:87da38093be9 144 typedef int (*HCICallback)(HCI* hci, HCI_CALLBACK_EVENT evt, const u8* data, int len);
lolpcc 0:87da38093be9 145
lolpcc 0:87da38093be9 146 #define MAX_BTDEVICES 8
lolpcc 0:87da38093be9 147
lolpcc 0:87da38093be9 148 class HCITransport;
lolpcc 0:87da38093be9 149 class HCI : public SocketHandler
lolpcc 0:87da38093be9 150 {
lolpcc 0:87da38093be9 151 HCITransport* _transport;
lolpcc 0:87da38093be9 152 HCICallback _callback;
lolpcc 0:87da38093be9 153 BD_ADDR _localAddr;
lolpcc 0:87da38093be9 154
lolpcc 0:87da38093be9 155 BTDevice _devices[MAX_BTDEVICES];
lolpcc 0:87da38093be9 156 int _deviceCount;
lolpcc 0:87da38093be9 157
lolpcc 0:87da38093be9 158 int _acl_mtu;
lolpcc 0:87da38093be9 159 int _acl_max_pkt;
lolpcc 0:87da38093be9 160 int _sco_mtu;
lolpcc 0:87da38093be9 161 int _sco_max_pkt;
lolpcc 0:87da38093be9 162
lolpcc 0:87da38093be9 163 int _state;
lolpcc 0:87da38093be9 164
lolpcc 0:87da38093be9 165 public:
lolpcc 0:87da38093be9 166
lolpcc 0:87da38093be9 167 // Open a local adapter
lolpcc 0:87da38093be9 168 int Open(HCITransport* transport, HCICallback callback);
lolpcc 0:87da38093be9 169
lolpcc 0:87da38093be9 170 // Return list of discovered addreses
lolpcc 0:87da38093be9 171 int GetDevices(BTDevice** devices, int maxDevices);
lolpcc 0:87da38093be9 172
lolpcc 0:87da38093be9 173 // Lookup a device by address or handle
lolpcc 0:87da38093be9 174 BTDevice* Find(const BD_ADDR* addr);
lolpcc 0:87da38093be9 175 BTDevice* Find(int handle);
lolpcc 0:87da38093be9 176
lolpcc 0:87da38093be9 177 // Disconnect from a remote device
lolpcc 0:87da38093be9 178 int Disconnect(const BD_ADDR* addr);
lolpcc 0:87da38093be9 179 int DisconnectAll();
lolpcc 0:87da38093be9 180
lolpcc 0:87da38093be9 181 // see what devies are in the system
lolpcc 0:87da38093be9 182 int Inquiry(int duration = 10);
lolpcc 0:87da38093be9 183
lolpcc 0:87da38093be9 184 // get a name, delivered in callback
lolpcc 0:87da38093be9 185 int RemoteNameRequest(const BD_ADDR* addr);
lolpcc 0:87da38093be9 186
lolpcc 0:87da38093be9 187 // Connect to a remote device
lolpcc 0:87da38093be9 188 int CreateConnection(const BD_ADDR* remoteAddr);
lolpcc 0:87da38093be9 189
lolpcc 0:87da38093be9 190 bool Busy();
lolpcc 0:87da38093be9 191
lolpcc 0:87da38093be9 192 // called from transport
lolpcc 0:87da38093be9 193 void HCIRecv(const u8* data, int len);
lolpcc 0:87da38093be9 194
lolpcc 0:87da38093be9 195 // called from transport
lolpcc 0:87da38093be9 196 void ACLRecv(const u8* data, int len);
lolpcc 0:87da38093be9 197
lolpcc 0:87da38093be9 198 // SocketHandler methods for maintaining L2CAP sockets
lolpcc 0:87da38093be9 199 virtual int Open(SocketInternal* sock, SocketAddrHdr* addr);
lolpcc 0:87da38093be9 200 virtual int Send(SocketInternal* sock, const u8* data, int len);
lolpcc 0:87da38093be9 201 virtual int Close(SocketInternal* sock);
lolpcc 0:87da38093be9 202
lolpcc 0:87da38093be9 203 private:
lolpcc 0:87da38093be9 204 void InquiryResult(const inquiry_info* info);
lolpcc 0:87da38093be9 205 void RemoteName(const BD_ADDR* addr, const char* name);
lolpcc 0:87da38093be9 206 void ConnectComplete(const connection_info* info);
lolpcc 0:87da38093be9 207 void DisconnectComplete(int handle);
lolpcc 0:87da38093be9 208 int SendCmd(int cmd, const u8* params = 0, int len = 0);
lolpcc 0:87da38093be9 209 void OnCommandComplete(int cmd, const u8* data, int len);
lolpcc 0:87da38093be9 210 void Callback(HCI_CALLBACK_EVENT c, const u8* data, int len);
lolpcc 0:87da38093be9 211 int PinCodeReply(const u8* data);
lolpcc 0:87da38093be9 212 };
lolpcc 0:87da38093be9 213
lolpcc 0:87da38093be9 214 class HCITransport
lolpcc 0:87da38093be9 215 {
lolpcc 0:87da38093be9 216 protected:
lolpcc 0:87da38093be9 217 HCI* _target;
lolpcc 0:87da38093be9 218 public:
lolpcc 0:87da38093be9 219 void Set(HCI* target) { _target = target; };
lolpcc 0:87da38093be9 220 virtual void HCISend(const u8* data, int len) = 0;
lolpcc 0:87da38093be9 221 virtual void ACLSend(const u8* data, int len) = 0;
lolpcc 0:87da38093be9 222 };
lolpcc 0:87da38093be9 223
lolpcc 0:87da38093be9 224 #endif