Test version of BlueUSB stack. Includes SDP and RFCOMM. As Client it allows to connect to my fischertechnik TX Controller. As Server it echo\\\\\\\'s characters to Putty. PIN=1234

Dependencies:   mbed myUSBHost AvailableMemory

Dependents:   mbed_TANK_Kinect myBlueUSB_ros ftusbClass

Committer:
networker
Date:
Wed May 04 09:10:11 2011 +0000
Revision:
2:0118da9e5169
Child:
5:378c208637e3
Better support for imcoming connections

Who changed what in which revision?

UserRevisionLine numberNew contents of line
networker 2:0118da9e5169 1 /*
networker 2:0118da9e5169 2 Copyright (c) 2010 Peter Barrett
networker 2:0118da9e5169 3
networker 2:0118da9e5169 4 Permission is hereby granted, free of charge, to any person obtaining a copy
networker 2:0118da9e5169 5 of this software and associated documentation files (the "Software"), to deal
networker 2:0118da9e5169 6 in the Software without restriction, including without limitation the rights
networker 2:0118da9e5169 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
networker 2:0118da9e5169 8 copies of the Software, and to permit persons to whom the Software is
networker 2:0118da9e5169 9 furnished to do so, subject to the following conditions:
networker 2:0118da9e5169 10
networker 2:0118da9e5169 11 The above copyright notice and this permission notice shall be included in
networker 2:0118da9e5169 12 all copies or substantial portions of the Software.
networker 2:0118da9e5169 13
networker 2:0118da9e5169 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
networker 2:0118da9e5169 15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
networker 2:0118da9e5169 16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
networker 2:0118da9e5169 17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
networker 2:0118da9e5169 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
networker 2:0118da9e5169 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
networker 2:0118da9e5169 20 THE SOFTWARE.
networker 2:0118da9e5169 21 */
networker 2:0118da9e5169 22
networker 2:0118da9e5169 23 #include <stdio.h>
networker 2:0118da9e5169 24 #include <stdlib.h>
networker 2:0118da9e5169 25 #include <stdio.h>
networker 2:0118da9e5169 26 #include <string.h>
networker 2:0118da9e5169 27
networker 2:0118da9e5169 28 #include "Utils.h"
networker 2:0118da9e5169 29 #include "Socket.h"
networker 2:0118da9e5169 30
networker 2:0118da9e5169 31 #define MAX_SOCKET_HANDLERS 4
networker 2:0118da9e5169 32 #define MAX_SOCKETS 16
networker 2:0118da9e5169 33
networker 2:0118da9e5169 34 class SocketInternalPad
networker 2:0118da9e5169 35 {
networker 2:0118da9e5169 36 public:
networker 2:0118da9e5169 37 SocketInternal si;
networker 2:0118da9e5169 38 u8 pad[8];
networker 2:0118da9e5169 39 };
networker 2:0118da9e5169 40
networker 2:0118da9e5169 41 class SocketManager
networker 2:0118da9e5169 42 {
networker 2:0118da9e5169 43 SocketHandler* _handlers[MAX_SOCKET_HANDLERS];
networker 2:0118da9e5169 44 SocketInternalPad _sockets[MAX_SOCKETS];
networker 2:0118da9e5169 45
networker 2:0118da9e5169 46 public:
networker 2:0118da9e5169 47 SocketManager()
networker 2:0118da9e5169 48 {
networker 2:0118da9e5169 49 memset(_handlers,0,sizeof(_handlers));
networker 2:0118da9e5169 50 memset(_sockets,0,sizeof(_sockets));
networker 2:0118da9e5169 51 }
networker 2:0118da9e5169 52
networker 2:0118da9e5169 53 SocketHandler* GetHandler(int type)
networker 2:0118da9e5169 54 {
networker 2:0118da9e5169 55 if (type < 1 || type > MAX_SOCKET_HANDLERS)
networker 2:0118da9e5169 56 return 0;
networker 2:0118da9e5169 57 return _handlers[type - 1];
networker 2:0118da9e5169 58 }
networker 2:0118da9e5169 59
networker 2:0118da9e5169 60 SocketInternal* GetInternal(int s)
networker 2:0118da9e5169 61 {
networker 2:0118da9e5169 62 if (s < 1 || s > MAX_SOCKETS)
networker 2:0118da9e5169 63 return 0;
networker 2:0118da9e5169 64 return &_sockets[s - 1].si;
networker 2:0118da9e5169 65 }
networker 2:0118da9e5169 66
networker 2:0118da9e5169 67 int RegisterSocketHandler(int type, SocketHandler* handler)
networker 2:0118da9e5169 68 {
networker 2:0118da9e5169 69 if (type < 1 || type > MAX_SOCKET_HANDLERS)
networker 2:0118da9e5169 70 return ERR_SOCKET_TYPE_NOT_FOUND;
networker 2:0118da9e5169 71 _handlers[type - 1] = handler;
networker 2:0118da9e5169 72 return 0;
networker 2:0118da9e5169 73 }
networker 2:0118da9e5169 74
networker 2:0118da9e5169 75 int Create(int type, SocketCallback callback, void* userData)
networker 2:0118da9e5169 76 {
networker 2:0118da9e5169 77 SocketHandler* h = GetHandler(type);
networker 2:0118da9e5169 78 if (!h)
networker 2:0118da9e5169 79 return ERR_SOCKET_TYPE_NOT_FOUND;
networker 2:0118da9e5169 80
networker 2:0118da9e5169 81 for (int i = 0; i < MAX_SOCKETS; i++)
networker 2:0118da9e5169 82 {
networker 2:0118da9e5169 83 SocketInternal* si = (SocketInternal*)(_sockets+i);
networker 2:0118da9e5169 84 if (si->ID == 0)
networker 2:0118da9e5169 85 {
networker 2:0118da9e5169 86 si->ID = i+1;
networker 2:0118da9e5169 87 si->Type = type;
networker 2:0118da9e5169 88 si->Callback = callback;
networker 2:0118da9e5169 89 si->userData = userData;
networker 2:0118da9e5169 90 printf("Creating socket %d for type %d, invoking 'Open' on %p (=%s)\n", si->ID, type, h, h->Name());
networker 2:0118da9e5169 91 return h->Create(si);
networker 2:0118da9e5169 92 }
networker 2:0118da9e5169 93 }
networker 2:0118da9e5169 94 return ERR_SOCKET_NONE_LEFT;
networker 2:0118da9e5169 95 }
networker 2:0118da9e5169 96
networker 2:0118da9e5169 97 int Open(int type, SocketAddrHdr* addr, SocketCallback callback, void* userData)
networker 2:0118da9e5169 98 {
networker 2:0118da9e5169 99 SocketHandler* h = GetHandler(type);
networker 2:0118da9e5169 100 if (!h)
networker 2:0118da9e5169 101 return ERR_SOCKET_TYPE_NOT_FOUND;
networker 2:0118da9e5169 102
networker 2:0118da9e5169 103 for (int i = 0; i < MAX_SOCKETS; i++)
networker 2:0118da9e5169 104 {
networker 2:0118da9e5169 105 SocketInternal* si = (SocketInternal*)(_sockets+i);
networker 2:0118da9e5169 106 if (si->ID == 0)
networker 2:0118da9e5169 107 {
networker 2:0118da9e5169 108 si->ID = i+1;
networker 2:0118da9e5169 109 si->Type = type;
networker 2:0118da9e5169 110 si->Callback = callback;
networker 2:0118da9e5169 111 si->userData = userData;
networker 2:0118da9e5169 112 printf("Opening socket %d for type %d, invoking 'Open' on %p (=%s)\n", si->ID, type, h, h->Name());
networker 2:0118da9e5169 113 return h->Open(si,addr);
networker 2:0118da9e5169 114 }
networker 2:0118da9e5169 115 }
networker 2:0118da9e5169 116 return ERR_SOCKET_NONE_LEFT;
networker 2:0118da9e5169 117 }
networker 2:0118da9e5169 118
networker 2:0118da9e5169 119 int Listen(int type, int channel, SocketCallback callback, void* userData)
networker 2:0118da9e5169 120 {
networker 2:0118da9e5169 121 SocketHandler* h = GetHandler(type);
networker 2:0118da9e5169 122 if (!h)
networker 2:0118da9e5169 123 return ERR_SOCKET_TYPE_NOT_FOUND;
networker 2:0118da9e5169 124
networker 2:0118da9e5169 125 for (int i = 0; i < MAX_SOCKETS; i++)
networker 2:0118da9e5169 126 {
networker 2:0118da9e5169 127 SocketInternal* si = (SocketInternal*)(_sockets+i);
networker 2:0118da9e5169 128 if (si->ID == 0)
networker 2:0118da9e5169 129 {
networker 2:0118da9e5169 130 si->ID = i+1;
networker 2:0118da9e5169 131 si->Type = type;
networker 2:0118da9e5169 132 si->Callback = callback;
networker 2:0118da9e5169 133 si->userData = userData;
networker 2:0118da9e5169 134 printf("Passively opening socket %d for type %d, invoking 'Listen' on %p (=%s)\n", si->ID, type, h, h->Name());
networker 2:0118da9e5169 135 int sn = h->Listen(si, channel);
networker 2:0118da9e5169 136 if (sn < 0)
networker 2:0118da9e5169 137 si->ID = 0;//free the socket when error
networker 2:0118da9e5169 138 return sn;
networker 2:0118da9e5169 139 }
networker 2:0118da9e5169 140 }
networker 2:0118da9e5169 141 return ERR_SOCKET_NONE_LEFT;
networker 2:0118da9e5169 142 }
networker 2:0118da9e5169 143
networker 2:0118da9e5169 144 int Accept(int type, int scid, int rxid, SocketCallback callback, void* userData)
networker 2:0118da9e5169 145 {
networker 2:0118da9e5169 146 SocketHandler* h = GetHandler(type);
networker 2:0118da9e5169 147 if (!h)
networker 2:0118da9e5169 148 return ERR_SOCKET_TYPE_NOT_FOUND;
networker 2:0118da9e5169 149
networker 2:0118da9e5169 150 for (int i = 0; i < MAX_SOCKETS; i++)
networker 2:0118da9e5169 151 {
networker 2:0118da9e5169 152 SocketInternal* si = (SocketInternal*)(_sockets+i);
networker 2:0118da9e5169 153 if (si->ID == 0)
networker 2:0118da9e5169 154 {
networker 2:0118da9e5169 155 si->ID = i+1;
networker 2:0118da9e5169 156 si->Type = type;
networker 2:0118da9e5169 157 si->Callback = callback;
networker 2:0118da9e5169 158 si->userData = userData;
networker 2:0118da9e5169 159 printf("Accepting socket %d for type %d, invoking 'Accept' on %p (=%s)\n", si->ID, type, h, h->Name());
networker 2:0118da9e5169 160 return h->Accept(si, scid, rxid);
networker 2:0118da9e5169 161 }
networker 2:0118da9e5169 162 }
networker 2:0118da9e5169 163 return ERR_SOCKET_NONE_LEFT;
networker 2:0118da9e5169 164 }
networker 2:0118da9e5169 165
networker 2:0118da9e5169 166 int Send(int socket, const u8* data, int len)
networker 2:0118da9e5169 167 {
networker 2:0118da9e5169 168 SocketInternal* si = GetInternal(socket);
networker 2:0118da9e5169 169 if (!si || si->ID != socket)
networker 2:0118da9e5169 170 return ERR_SOCKET_NOT_FOUND;
networker 2:0118da9e5169 171 // printf("sending %d bytes to socket %d (ID=%d)\n", len, socket, si->ID);
networker 2:0118da9e5169 172 return GetHandler(si->Type)->Send(si,data,len);
networker 2:0118da9e5169 173 }
networker 2:0118da9e5169 174
networker 2:0118da9e5169 175 int Close(int socket)
networker 2:0118da9e5169 176 {
networker 2:0118da9e5169 177 SocketInternal* si = GetInternal(socket);
networker 2:0118da9e5169 178 if (!si || si->ID != socket){
networker 2:0118da9e5169 179 printf("Close: socket %d not found\n");
networker 2:0118da9e5169 180 return ERR_SOCKET_NOT_FOUND;
networker 2:0118da9e5169 181 }
networker 2:0118da9e5169 182 printf("Close: socket %d (type=%d)\n", socket, si->Type);
networker 2:0118da9e5169 183 si->SetState(SocketState_Closing);
networker 2:0118da9e5169 184 int retval = GetHandler(si->Type)->Close(si);
networker 2:0118da9e5169 185 //si->SetState(Socket_Closed);
networker 2:0118da9e5169 186 //si->ID = 0;
networker 2:0118da9e5169 187 return retval;
networker 2:0118da9e5169 188 }
networker 2:0118da9e5169 189 };
networker 2:0118da9e5169 190
networker 2:0118da9e5169 191 SocketManager gSocketManager;
networker 2:0118da9e5169 192
networker 2:0118da9e5169 193 int Socket_Open(int type, SocketAddrHdr* addr, SocketCallback callback, void* userData)
networker 2:0118da9e5169 194 {
networker 2:0118da9e5169 195 return gSocketManager.Open(type,addr,callback,userData);
networker 2:0118da9e5169 196 }
networker 2:0118da9e5169 197
networker 2:0118da9e5169 198 int Socket_Listen(int type, int channel, SocketCallback callback, void* userData) // Open a socket for listening
networker 2:0118da9e5169 199 {
networker 2:0118da9e5169 200 return gSocketManager.Listen(type,channel,callback,userData);
networker 2:0118da9e5169 201 }
networker 2:0118da9e5169 202
networker 2:0118da9e5169 203 int Socket_Accept(int type, int scid, int rxid, SocketCallback callback, void* userData) // Open a socket for an incoming connection
networker 2:0118da9e5169 204 {
networker 2:0118da9e5169 205 return gSocketManager.Accept(type,scid,rxid,callback,userData);
networker 2:0118da9e5169 206 }
networker 2:0118da9e5169 207
networker 2:0118da9e5169 208 int Socket_Send(int socket, const u8* data, int len)
networker 2:0118da9e5169 209 {
networker 2:0118da9e5169 210 return gSocketManager.Send(socket,data,len);
networker 2:0118da9e5169 211 }
networker 2:0118da9e5169 212
networker 2:0118da9e5169 213 int Socket_Close(int socket)
networker 2:0118da9e5169 214 {
networker 2:0118da9e5169 215 return gSocketManager.Close(socket);
networker 2:0118da9e5169 216 }
networker 2:0118da9e5169 217
networker 2:0118da9e5169 218 int RegisterSocketHandler(int type, SocketHandler* handler)
networker 2:0118da9e5169 219 {
networker 2:0118da9e5169 220 return gSocketManager.RegisterSocketHandler(type,handler);
networker 2:0118da9e5169 221 }
networker 2:0118da9e5169 222
networker 2:0118da9e5169 223 SocketInternal* GetSocketInternal(int socket)
networker 2:0118da9e5169 224 {
networker 2:0118da9e5169 225 return gSocketManager.GetInternal(socket);
networker 2:0118da9e5169 226 }
networker 2:0118da9e5169 227