Based on Peter Barrett\'s work on BlueUSB, I added support for the PS3 Sixaxis controller (both USB and Bluetooth). When connecting a Sixaxis via USB, it will be paired with the (hardcoded) MAC address of my Bluetooth dongle.

Dependencies:   mbed

Dependents:   PS3_BlueUSB_downstate

Committer:
BartJanssens
Date:
Tue Apr 26 16:09:17 2011 +0000
Revision:
0:99a111b75cb4

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
BartJanssens 0:99a111b75cb4 1 /*
BartJanssens 0:99a111b75cb4 2 Copyright (c) 2010 Peter Barrett
BartJanssens 0:99a111b75cb4 3
BartJanssens 0:99a111b75cb4 4 Permission is hereby granted, free of charge, to any person obtaining a copy
BartJanssens 0:99a111b75cb4 5 of this software and associated documentation files (the "Software"), to deal
BartJanssens 0:99a111b75cb4 6 in the Software without restriction, including without limitation the rights
BartJanssens 0:99a111b75cb4 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
BartJanssens 0:99a111b75cb4 8 copies of the Software, and to permit persons to whom the Software is
BartJanssens 0:99a111b75cb4 9 furnished to do so, subject to the following conditions:
BartJanssens 0:99a111b75cb4 10
BartJanssens 0:99a111b75cb4 11 The above copyright notice and this permission notice shall be included in
BartJanssens 0:99a111b75cb4 12 all copies or substantial portions of the Software.
BartJanssens 0:99a111b75cb4 13
BartJanssens 0:99a111b75cb4 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
BartJanssens 0:99a111b75cb4 15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
BartJanssens 0:99a111b75cb4 16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
BartJanssens 0:99a111b75cb4 17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
BartJanssens 0:99a111b75cb4 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
BartJanssens 0:99a111b75cb4 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
BartJanssens 0:99a111b75cb4 20 THE SOFTWARE.
BartJanssens 0:99a111b75cb4 21 */
BartJanssens 0:99a111b75cb4 22
BartJanssens 0:99a111b75cb4 23 /*
BartJanssens 0:99a111b75cb4 24 Tue Apr 26 2011 Bart Janssens: added a socket listener
BartJanssens 0:99a111b75cb4 25 */
BartJanssens 0:99a111b75cb4 26
BartJanssens 0:99a111b75cb4 27 #include <stdio.h>
BartJanssens 0:99a111b75cb4 28 #include <stdlib.h>
BartJanssens 0:99a111b75cb4 29 #include <stdio.h>
BartJanssens 0:99a111b75cb4 30 #include <string.h>
BartJanssens 0:99a111b75cb4 31
BartJanssens 0:99a111b75cb4 32 #include "Utils.h"
BartJanssens 0:99a111b75cb4 33 #include "Socket.h"
BartJanssens 0:99a111b75cb4 34
BartJanssens 0:99a111b75cb4 35 #define MAX_SOCKET_HANDLERS 3
BartJanssens 0:99a111b75cb4 36 #define MAX_SOCKETS 16
BartJanssens 0:99a111b75cb4 37 #define MAX_LISTEN 8
BartJanssens 0:99a111b75cb4 38
BartJanssens 0:99a111b75cb4 39 class SocketInternalPad
BartJanssens 0:99a111b75cb4 40 {
BartJanssens 0:99a111b75cb4 41 public:
BartJanssens 0:99a111b75cb4 42 SocketInternal si;
BartJanssens 0:99a111b75cb4 43 u8 pad[8];
BartJanssens 0:99a111b75cb4 44 };
BartJanssens 0:99a111b75cb4 45
BartJanssens 0:99a111b75cb4 46
BartJanssens 0:99a111b75cb4 47
BartJanssens 0:99a111b75cb4 48
BartJanssens 0:99a111b75cb4 49 class SocketManager
BartJanssens 0:99a111b75cb4 50 {
BartJanssens 0:99a111b75cb4 51 SocketHandler* _handlers[MAX_SOCKET_HANDLERS];
BartJanssens 0:99a111b75cb4 52 SocketInternalPad _sockets[MAX_SOCKETS];
BartJanssens 0:99a111b75cb4 53 SocketListener _listeners[MAX_LISTEN];
BartJanssens 0:99a111b75cb4 54
BartJanssens 0:99a111b75cb4 55 public:
BartJanssens 0:99a111b75cb4 56 SocketManager()
BartJanssens 0:99a111b75cb4 57 {
BartJanssens 0:99a111b75cb4 58 memset(_handlers,0,sizeof(_handlers));
BartJanssens 0:99a111b75cb4 59 memset(_sockets,0,sizeof(_sockets));
BartJanssens 0:99a111b75cb4 60 memset(_listeners,0,sizeof(_listeners));
BartJanssens 0:99a111b75cb4 61 }
BartJanssens 0:99a111b75cb4 62
BartJanssens 0:99a111b75cb4 63 SocketHandler* GetHandler(int type)
BartJanssens 0:99a111b75cb4 64 {
BartJanssens 0:99a111b75cb4 65 if (type < 1 || type > MAX_SOCKET_HANDLERS)
BartJanssens 0:99a111b75cb4 66 return 0;
BartJanssens 0:99a111b75cb4 67 return _handlers[type - 1];
BartJanssens 0:99a111b75cb4 68 }
BartJanssens 0:99a111b75cb4 69
BartJanssens 0:99a111b75cb4 70 SocketInternal* GetInternal(int s)
BartJanssens 0:99a111b75cb4 71 {
BartJanssens 0:99a111b75cb4 72 if (s < 1 || s > MAX_SOCKETS)
BartJanssens 0:99a111b75cb4 73 return 0;
BartJanssens 0:99a111b75cb4 74 return &_sockets[s - 1].si;
BartJanssens 0:99a111b75cb4 75 }
BartJanssens 0:99a111b75cb4 76
BartJanssens 0:99a111b75cb4 77 int RegisterSocketHandler(int type, SocketHandler* handler)
BartJanssens 0:99a111b75cb4 78 {
BartJanssens 0:99a111b75cb4 79 if (type < 1 || type > MAX_SOCKET_HANDLERS)
BartJanssens 0:99a111b75cb4 80 return ERR_SOCKET_TYPE_NOT_FOUND;
BartJanssens 0:99a111b75cb4 81 _handlers[type - 1] = handler;
BartJanssens 0:99a111b75cb4 82 return 0;
BartJanssens 0:99a111b75cb4 83 }
BartJanssens 0:99a111b75cb4 84
BartJanssens 0:99a111b75cb4 85 int Open(int type, SocketAddrHdr* addr, SocketCallback callback, void* userData)
BartJanssens 0:99a111b75cb4 86 {
BartJanssens 0:99a111b75cb4 87 SocketHandler* h = GetHandler(type);
BartJanssens 0:99a111b75cb4 88 if (!h)
BartJanssens 0:99a111b75cb4 89 return ERR_SOCKET_TYPE_NOT_FOUND;
BartJanssens 0:99a111b75cb4 90
BartJanssens 0:99a111b75cb4 91 for (int i = 0; i < MAX_SOCKETS; i++)
BartJanssens 0:99a111b75cb4 92 {
BartJanssens 0:99a111b75cb4 93 SocketInternal* si = (SocketInternal*)(_sockets+i);
BartJanssens 0:99a111b75cb4 94 if (si->ID == 0)
BartJanssens 0:99a111b75cb4 95 {
BartJanssens 0:99a111b75cb4 96 //printf("Call to Socket Manager Open \r\n");
BartJanssens 0:99a111b75cb4 97 si->ID = i+1;
BartJanssens 0:99a111b75cb4 98 si->Type = type;
BartJanssens 0:99a111b75cb4 99 si->Callback = callback;
BartJanssens 0:99a111b75cb4 100 si->userData = userData;
BartJanssens 0:99a111b75cb4 101 return h->Open(si,addr);
BartJanssens 0:99a111b75cb4 102 }
BartJanssens 0:99a111b75cb4 103 }
BartJanssens 0:99a111b75cb4 104 return ERR_SOCKET_NONE_LEFT;
BartJanssens 0:99a111b75cb4 105 }
BartJanssens 0:99a111b75cb4 106
BartJanssens 0:99a111b75cb4 107 SocketInternal* Create(int type, SocketAddrHdr* addr, int port)
BartJanssens 0:99a111b75cb4 108 {
BartJanssens 0:99a111b75cb4 109 SocketInternal* si;
BartJanssens 0:99a111b75cb4 110 SocketListener* li;
BartJanssens 0:99a111b75cb4 111 SocketHandler* h = GetHandler(type);
BartJanssens 0:99a111b75cb4 112 if (!h)
BartJanssens 0:99a111b75cb4 113 return 0;
BartJanssens 0:99a111b75cb4 114
BartJanssens 0:99a111b75cb4 115 for (int i = 0; i < MAX_SOCKETS; i++)
BartJanssens 0:99a111b75cb4 116 {
BartJanssens 0:99a111b75cb4 117 si = (SocketInternal*)(_sockets+i);
BartJanssens 0:99a111b75cb4 118 if (si->ID == 0)
BartJanssens 0:99a111b75cb4 119 {
BartJanssens 0:99a111b75cb4 120 si->ID = i+1;
BartJanssens 0:99a111b75cb4 121 si->State = SocketState_Listen;
BartJanssens 0:99a111b75cb4 122 si->Type = type;
BartJanssens 0:99a111b75cb4 123 si->port = port;
BartJanssens 0:99a111b75cb4 124 for (int i = 0; i < MAX_LISTEN; i++){
BartJanssens 0:99a111b75cb4 125 li = (SocketListener*)(_listeners+i);
BartJanssens 0:99a111b75cb4 126 if (( li->Type == si->Type )&& (li->port == si->port)) {
BartJanssens 0:99a111b75cb4 127 si->Callback = li->Callback;
BartJanssens 0:99a111b75cb4 128 si->userData = li->userData;
BartJanssens 0:99a111b75cb4 129 h->Create(si,addr);
BartJanssens 0:99a111b75cb4 130 return si;
BartJanssens 0:99a111b75cb4 131 }
BartJanssens 0:99a111b75cb4 132
BartJanssens 0:99a111b75cb4 133 }
BartJanssens 0:99a111b75cb4 134 }
BartJanssens 0:99a111b75cb4 135 }
BartJanssens 0:99a111b75cb4 136
BartJanssens 0:99a111b75cb4 137 }
BartJanssens 0:99a111b75cb4 138
BartJanssens 0:99a111b75cb4 139
BartJanssens 0:99a111b75cb4 140 int Listen(int type, int port, SocketCallback callback,void* userData)
BartJanssens 0:99a111b75cb4 141 {
BartJanssens 0:99a111b75cb4 142 SocketListener* li;
BartJanssens 0:99a111b75cb4 143 SocketHandler* h = GetHandler(type);
BartJanssens 0:99a111b75cb4 144 if (!h) return ERR_SOCKET_TYPE_NOT_FOUND;
BartJanssens 0:99a111b75cb4 145
BartJanssens 0:99a111b75cb4 146 //printf("Call to Socket Manager Listen \r\n");
BartJanssens 0:99a111b75cb4 147 for (int i = 0; i < MAX_LISTEN; i++)
BartJanssens 0:99a111b75cb4 148 {
BartJanssens 0:99a111b75cb4 149 li = (SocketListener*)(_listeners+i);
BartJanssens 0:99a111b75cb4 150 if (( li->Type == type )&& (li->port == port)) {
BartJanssens 0:99a111b75cb4 151 //printf("Port %d is already in use\r\n",port);
BartJanssens 0:99a111b75cb4 152 return ERR_SOCKET_IN_USE; //in use
BartJanssens 0:99a111b75cb4 153 }
BartJanssens 0:99a111b75cb4 154 }
BartJanssens 0:99a111b75cb4 155
BartJanssens 0:99a111b75cb4 156 for (int i = 0; i < MAX_LISTEN; i++)
BartJanssens 0:99a111b75cb4 157 {
BartJanssens 0:99a111b75cb4 158 li = (SocketListener*)(_listeners+i);
BartJanssens 0:99a111b75cb4 159 if (( li->Type == 0 )&& (li->port == 0)) {
BartJanssens 0:99a111b75cb4 160 li->ID = i+1;
BartJanssens 0:99a111b75cb4 161 li->Type = type;
BartJanssens 0:99a111b75cb4 162 li->port = port;
BartJanssens 0:99a111b75cb4 163 li->Callback = callback;
BartJanssens 0:99a111b75cb4 164 li->userData = userData;
BartJanssens 0:99a111b75cb4 165 //printf("Listening on port %d \r\n",port);
BartJanssens 0:99a111b75cb4 166 return 0;
BartJanssens 0:99a111b75cb4 167 }
BartJanssens 0:99a111b75cb4 168 }
BartJanssens 0:99a111b75cb4 169 //printf("Max listen ports reached\r\n",port);
BartJanssens 0:99a111b75cb4 170 return ERR_SOCKET_NONE_LEFT;
BartJanssens 0:99a111b75cb4 171 }
BartJanssens 0:99a111b75cb4 172
BartJanssens 0:99a111b75cb4 173 int InUse(int type, int port)
BartJanssens 0:99a111b75cb4 174 {
BartJanssens 0:99a111b75cb4 175 SocketListener* li;
BartJanssens 0:99a111b75cb4 176 SocketHandler* h = GetHandler(type);
BartJanssens 0:99a111b75cb4 177 if (!h) return ERR_SOCKET_TYPE_NOT_FOUND;
BartJanssens 0:99a111b75cb4 178 for (int i = 0; i < MAX_LISTEN; i++)
BartJanssens 0:99a111b75cb4 179 {
BartJanssens 0:99a111b75cb4 180 li = (SocketListener*)(_listeners+i);
BartJanssens 0:99a111b75cb4 181 if (( li->Type == type )&& (li->port == port)) {
BartJanssens 0:99a111b75cb4 182
BartJanssens 0:99a111b75cb4 183 //printf("Listen check on port %d OK\r\n",port);
BartJanssens 0:99a111b75cb4 184 return 0;
BartJanssens 0:99a111b75cb4 185 }
BartJanssens 0:99a111b75cb4 186 }
BartJanssens 0:99a111b75cb4 187 //printf("Listen check on port %d NOK\r\n",port);
BartJanssens 0:99a111b75cb4 188 return ERR_SOCKET_NONE_LEFT;
BartJanssens 0:99a111b75cb4 189 }
BartJanssens 0:99a111b75cb4 190
BartJanssens 0:99a111b75cb4 191
BartJanssens 0:99a111b75cb4 192 int Accept(int socket, SocketCallback callback, void* userData)
BartJanssens 0:99a111b75cb4 193 {
BartJanssens 0:99a111b75cb4 194 SocketInternal* si = GetInternal(socket);
BartJanssens 0:99a111b75cb4 195 if (!si || si->ID != socket)
BartJanssens 0:99a111b75cb4 196 return ERR_SOCKET_NOT_FOUND;
BartJanssens 0:99a111b75cb4 197
BartJanssens 0:99a111b75cb4 198 si->Callback = callback;
BartJanssens 0:99a111b75cb4 199 si->userData = userData;
BartJanssens 0:99a111b75cb4 200
BartJanssens 0:99a111b75cb4 201 //printf("Call to Socket Manager Accept \r\n");
BartJanssens 0:99a111b75cb4 202 return 0;
BartJanssens 0:99a111b75cb4 203
BartJanssens 0:99a111b75cb4 204 }
BartJanssens 0:99a111b75cb4 205
BartJanssens 0:99a111b75cb4 206 int Send(int socket, const u8* data, int len)
BartJanssens 0:99a111b75cb4 207 {
BartJanssens 0:99a111b75cb4 208 //printf("Call to Socket Manager Send \r\n");
BartJanssens 0:99a111b75cb4 209 SocketInternal* si = GetInternal(socket);
BartJanssens 0:99a111b75cb4 210 //printf("socket = %d si->ID = %d si->Type = %d \r\n", socket, si->ID, si->Type);
BartJanssens 0:99a111b75cb4 211 if (!si || si->ID != socket){
BartJanssens 0:99a111b75cb4 212 //printf("send: socket not found \r\n");
BartJanssens 0:99a111b75cb4 213 return ERR_SOCKET_NOT_FOUND;
BartJanssens 0:99a111b75cb4 214 }
BartJanssens 0:99a111b75cb4 215 //printf("Calling l2cap send \r\n");
BartJanssens 0:99a111b75cb4 216
BartJanssens 0:99a111b75cb4 217 SocketHandler* h = GetHandler(si->Type);
BartJanssens 0:99a111b75cb4 218 if (!h) {
BartJanssens 0:99a111b75cb4 219 //printf("Send: no socket type found \r\n");
BartJanssens 0:99a111b75cb4 220 return ERR_SOCKET_TYPE_NOT_FOUND;
BartJanssens 0:99a111b75cb4 221 }
BartJanssens 0:99a111b75cb4 222 return h->Send(si,data,len);
BartJanssens 0:99a111b75cb4 223
BartJanssens 0:99a111b75cb4 224 }
BartJanssens 0:99a111b75cb4 225
BartJanssens 0:99a111b75cb4 226 int Close(int socket)
BartJanssens 0:99a111b75cb4 227 {
BartJanssens 0:99a111b75cb4 228 SocketInternal* si = GetInternal(socket);
BartJanssens 0:99a111b75cb4 229 if (!si || si->ID != socket)
BartJanssens 0:99a111b75cb4 230 return ERR_SOCKET_NOT_FOUND;
BartJanssens 0:99a111b75cb4 231 si->ID = 0;
BartJanssens 0:99a111b75cb4 232 return GetHandler(si->Type)->Close(si);
BartJanssens 0:99a111b75cb4 233 }
BartJanssens 0:99a111b75cb4 234 };
BartJanssens 0:99a111b75cb4 235
BartJanssens 0:99a111b75cb4 236 SocketManager gSocketManager;
BartJanssens 0:99a111b75cb4 237
BartJanssens 0:99a111b75cb4 238 int Socket_Open(int type, SocketAddrHdr* addr, SocketCallback callback, void* userData)
BartJanssens 0:99a111b75cb4 239 {
BartJanssens 0:99a111b75cb4 240 //printf("Call to Socket Open \r\n");
BartJanssens 0:99a111b75cb4 241 return gSocketManager.Open(type,addr,callback,userData);
BartJanssens 0:99a111b75cb4 242 }
BartJanssens 0:99a111b75cb4 243
BartJanssens 0:99a111b75cb4 244 SocketInternal* Socket_Create(int type, SocketAddrHdr* addr, int port)
BartJanssens 0:99a111b75cb4 245 {
BartJanssens 0:99a111b75cb4 246 return gSocketManager.Create(type, addr, port);
BartJanssens 0:99a111b75cb4 247 }
BartJanssens 0:99a111b75cb4 248
BartJanssens 0:99a111b75cb4 249 int Socket_Send(int socket, const u8* data, int len)
BartJanssens 0:99a111b75cb4 250 {
BartJanssens 0:99a111b75cb4 251 //printf("Call to Socket_Send \r\n");
BartJanssens 0:99a111b75cb4 252 return gSocketManager.Send(socket,data,len);
BartJanssens 0:99a111b75cb4 253 }
BartJanssens 0:99a111b75cb4 254
BartJanssens 0:99a111b75cb4 255 int Socket_Close(int socket)
BartJanssens 0:99a111b75cb4 256 {
BartJanssens 0:99a111b75cb4 257 return gSocketManager.Close(socket);
BartJanssens 0:99a111b75cb4 258 }
BartJanssens 0:99a111b75cb4 259
BartJanssens 0:99a111b75cb4 260 int Socket_Listen(int type, int port,SocketCallback callback, void* userData)
BartJanssens 0:99a111b75cb4 261 {
BartJanssens 0:99a111b75cb4 262 //printf("Call to Socket_Listen \r\n");
BartJanssens 0:99a111b75cb4 263 return gSocketManager.Listen(type, port,callback,userData);
BartJanssens 0:99a111b75cb4 264 }
BartJanssens 0:99a111b75cb4 265
BartJanssens 0:99a111b75cb4 266 int Socket_InUse(int type, int port)
BartJanssens 0:99a111b75cb4 267 {
BartJanssens 0:99a111b75cb4 268 //printf("Call to Socket_InUse \r\n");
BartJanssens 0:99a111b75cb4 269 return gSocketManager.InUse(type, port);
BartJanssens 0:99a111b75cb4 270 }
BartJanssens 0:99a111b75cb4 271
BartJanssens 0:99a111b75cb4 272 int Socket_Accept(int socket, SocketCallback callback, void* userData)
BartJanssens 0:99a111b75cb4 273 {
BartJanssens 0:99a111b75cb4 274 //printf("Call to Socket_Accept \r\n");
BartJanssens 0:99a111b75cb4 275 return gSocketManager.Accept(socket, callback, userData);
BartJanssens 0:99a111b75cb4 276 }
BartJanssens 0:99a111b75cb4 277
BartJanssens 0:99a111b75cb4 278 int RegisterSocketHandler(int type, SocketHandler* handler)
BartJanssens 0:99a111b75cb4 279 {
BartJanssens 0:99a111b75cb4 280 return gSocketManager.RegisterSocketHandler(type,handler);
BartJanssens 0:99a111b75cb4 281 }
BartJanssens 0:99a111b75cb4 282
BartJanssens 0:99a111b75cb4 283 SocketInternal* GetSocketInternal(int socket)
BartJanssens 0:99a111b75cb4 284 {
BartJanssens 0:99a111b75cb4 285 return gSocketManager.GetInternal(socket);
BartJanssens 0:99a111b75cb4 286 }
BartJanssens 0:99a111b75cb4 287