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
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 #ifndef SOCKET_H_INCLUDED
networker 2:0118da9e5169 24 #define SOCKET_H_INCLUDED
networker 2:0118da9e5169 25
networker 2:0118da9e5169 26 #define SOCKET_HCI 1
networker 2:0118da9e5169 27 #define SOCKET_L2CAP 2
networker 2:0118da9e5169 28 #define SOCKET_RFCOM 3
networker 2:0118da9e5169 29 #define SOCKET_SDP 4
networker 2:0118da9e5169 30
networker 2:0118da9e5169 31 typedef struct
networker 2:0118da9e5169 32 {
networker 2:0118da9e5169 33 u8 AddressSpecific[0]; // BDADDR,psm etc
networker 2:0118da9e5169 34 } SocketAddrHdr;
networker 2:0118da9e5169 35
networker 2:0118da9e5169 36 enum SocketState
networker 2:0118da9e5169 37 {
networker 2:0118da9e5169 38 SocketState_Unknown,
networker 2:0118da9e5169 39 SocketState_Opening,
networker 2:0118da9e5169 40 SocketState_Open,
networker 2:0118da9e5169 41 SocketState_Closing,
networker 2:0118da9e5169 42 SocketState_Closed,
networker 2:0118da9e5169 43 SocketState_Listen,
networker 2:0118da9e5169 44 SocketState_Accepting,
networker 2:0118da9e5169 45 SocketState_L2CAP_WaitConnect = 8,
networker 2:0118da9e5169 46 SocketState_L2CAP_WaitConnectRsp,
networker 2:0118da9e5169 47 SocketState_L2CAP_WaitDisconnect,
networker 2:0118da9e5169 48 SocketState_L2CAP_Config_wait = 16,
networker 2:0118da9e5169 49 SocketState_L2CAP_Config_wait_send,
networker 2:0118da9e5169 50 SocketState_L2CAP_Config_wait_req,
networker 2:0118da9e5169 51 SocketState_L2CAP_Config_wait_rsp,
networker 2:0118da9e5169 52 SocketState_L2CAP_Config_wait_reqrsp
networker 2:0118da9e5169 53 };
networker 2:0118da9e5169 54
networker 2:0118da9e5169 55 typedef void (*SocketCallback)(int socket, SocketState state, const u8* data, int len, void* userData);
networker 2:0118da9e5169 56
networker 2:0118da9e5169 57 int Socket_Create(int type, SocketCallback callback, void* userData); // Allocate a socket
networker 2:0118da9e5169 58 int Socket_Open(int type, SocketAddrHdr* addr, SocketCallback callback, void* userData); // Open a socket
networker 2:0118da9e5169 59 int Socket_Listen(int type, int channel, SocketCallback callback, void* userData); // Open a socket passive
networker 2:0118da9e5169 60 int Socket_Accept(int type, int scid, int rxid, SocketCallback callback, void* userData); // Open a socket for an incoming connection
networker 2:0118da9e5169 61 int Socket_Send(int socket, const u8* data, int len);
networker 2:0118da9e5169 62 int Socket_State(int socket);
networker 2:0118da9e5169 63 int Socket_Close(int socket);
networker 2:0118da9e5169 64
networker 2:0118da9e5169 65 //===========================================================================
networker 2:0118da9e5169 66 //===========================================================================
networker 2:0118da9e5169 67 // Don't need to look at or use anything below this line:
networker 2:0118da9e5169 68 // Internal representation of socket
networker 2:0118da9e5169 69
networker 2:0118da9e5169 70 class SocketHandler;
networker 2:0118da9e5169 71 class SocketInternal
networker 2:0118da9e5169 72 {
networker 2:0118da9e5169 73 public:
networker 2:0118da9e5169 74
networker 2:0118da9e5169 75 u8 ID;
networker 2:0118da9e5169 76 u8 State;
networker 2:0118da9e5169 77 u8 Type;
networker 2:0118da9e5169 78 u8 B0;
networker 2:0118da9e5169 79 SocketCallback Callback;
networker 2:0118da9e5169 80 void* userData;
networker 2:0118da9e5169 81 u8 Data[0]; // Extra socket data starts here
networker 2:0118da9e5169 82
networker 2:0118da9e5169 83 void Recv(const u8* data, int len)
networker 2:0118da9e5169 84 {
networker 2:0118da9e5169 85 Callback(ID,(SocketState)State,data,len,userData);
networker 2:0118da9e5169 86 }
networker 2:0118da9e5169 87
networker 2:0118da9e5169 88 void SetState(SocketState state)
networker 2:0118da9e5169 89 {
networker 2:0118da9e5169 90 State = state;
networker 2:0118da9e5169 91 Callback(ID,(SocketState)State,0,0,userData);
networker 2:0118da9e5169 92 if (state == SocketState_Closed) {
networker 2:0118da9e5169 93 printf("Socket %d has been freed\n", ID);
networker 2:0118da9e5169 94 ID = 0;
networker 2:0118da9e5169 95 }
networker 2:0118da9e5169 96 }
networker 2:0118da9e5169 97 };
networker 2:0118da9e5169 98
networker 2:0118da9e5169 99 class SocketHandler
networker 2:0118da9e5169 100 {
networker 2:0118da9e5169 101 public:
networker 2:0118da9e5169 102 virtual int Create(SocketInternal* sock) { printf("SocketHandler::Create: not implemented for %s\n", Name()); return sock->ID;}
networker 2:0118da9e5169 103 virtual int Open(SocketInternal* sock, SocketAddrHdr* addr) = 0;
networker 2:0118da9e5169 104 virtual int Send(SocketInternal* sock, const u8* data, int len) = 0;
networker 2:0118da9e5169 105 virtual int Close(SocketInternal* sock) = 0;
networker 2:0118da9e5169 106 virtual int Listen(SocketInternal* sock, int channel) { printf("SocketHandler::Listen: not implemented for %s\n", Name());return 0;}
networker 2:0118da9e5169 107 virtual int Accept(SocketInternal* sock, int scid, int rxid) { printf("SocketHandler::Accept: not implemented for %s\n", Name());return 0;}
networker 2:0118da9e5169 108 virtual char* Name() { return "Base_SocketHandler";}
networker 2:0118da9e5169 109 };
networker 2:0118da9e5169 110
networker 2:0118da9e5169 111 int RegisterSocketHandler(int type, SocketHandler* handler);
networker 2:0118da9e5169 112 SocketInternal* GetSocketInternal(int socket);
networker 2:0118da9e5169 113
networker 2:0118da9e5169 114 #define ERR_SOCKET_TYPE_NOT_FOUND -200
networker 2:0118da9e5169 115 #define ERR_SOCKET_NOT_FOUND -201
networker 2:0118da9e5169 116 #define ERR_SOCKET_NONE_LEFT -202
networker 2:0118da9e5169 117 #define ERR_SOCKET_CANT_LISTEN -203
networker 2:0118da9e5169 118
networker 2:0118da9e5169 119 #endif // SOCKET_H_INCLUDED