Simons Wii controlled m3pi program

Dependencies:   mbed m3pi ID12RFIDIRQ

Committer:
chris
Date:
Wed May 18 14:50:46 2011 +0000
Revision:
0:0ab65a1aef12
Added some printing to the m3pi screen

Who changed what in which revision?

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