通信変えたやつです

Dependencies:   mbed

Fork of F3RC_syudou_master_3 by F3RC1班

Committer:
yuto17320508
Date:
Thu Sep 14 01:20:12 2017 +0000
Revision:
26:91dd637de4d4
Parent:
16:b232fd9ee9c2
a

Who changed what in which revision?

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