http://mbed.org/users/gsfan/notebook/gainspan_wifi/ porterd from: http://electronics.trev.id.au/2012/02/07/gainspan-wifi-library-for-chipkit-and-arduino/

Dependencies:   mbed

Committer:
gsfan
Date:
Sun May 27 03:19:54 2012 +0000
Revision:
0:bf663118b11b

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gsfan 0:bf663118b11b 1 /*
gsfan 0:bf663118b11b 2 * Gainspan Wifi library for mbed
gsfan 0:bf663118b11b 3 * Modified for mbed, 2012 gsfan.
gsfan 0:bf663118b11b 4 *
gsfan 0:bf663118b11b 5
gsfan 0:bf663118b11b 6 socket.cpp - network sockett class
gsfan 0:bf663118b11b 7
gsfan 0:bf663118b11b 8 Copyright (C) 2011 DIYSandbox LLC
gsfan 0:bf663118b11b 9
gsfan 0:bf663118b11b 10 This program is free software; you can redistribute it and/or
gsfan 0:bf663118b11b 11 modify it under the terms of the GNU General Public License
gsfan 0:bf663118b11b 12 as published by the Free Software Foundation; either version 2
gsfan 0:bf663118b11b 13 of the License, or (at your option) any later version.
gsfan 0:bf663118b11b 14
gsfan 0:bf663118b11b 15 This program is distributed in the hope that it will be useful,
gsfan 0:bf663118b11b 16 but WITHOUT ANY WARRANTY; without even the implied warranty of
gsfan 0:bf663118b11b 17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
gsfan 0:bf663118b11b 18 GNU General Public License for more details.
gsfan 0:bf663118b11b 19
gsfan 0:bf663118b11b 20 You should have received a copy of the GNU General Public License
gsfan 0:bf663118b11b 21 along with this program; if not, write to the Free Software
gsfan 0:bf663118b11b 22 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
gsfan 0:bf663118b11b 23 */
gsfan 0:bf663118b11b 24
gsfan 0:bf663118b11b 25 #include "dbg.h"
gsfan 0:bf663118b11b 26 #include "mbed.h"
gsfan 0:bf663118b11b 27 #include "socket.h"
gsfan 0:bf663118b11b 28
gsfan 0:bf663118b11b 29 /**
gsfan 0:bf663118b11b 30 * @brief This Socket function initialize the channel in perticular mode, and set the port and wait for W5100 done it.
gsfan 0:bf663118b11b 31 * @return 1 for success else 0.
gsfan 0:bf663118b11b 32 */
gsfan 0:bf663118b11b 33 int GSSocket::socket(SOCKET s, int protocol, int port, int flag)
gsfan 0:bf663118b11b 34 {
gsfan 0:bf663118b11b 35 if ((protocol == IPPROTO::TCP))
gsfan 0:bf663118b11b 36 {
gsfan 0:bf663118b11b 37 close(s);
gsfan 0:bf663118b11b 38 if (port != 0) {
gsfan 0:bf663118b11b 39 configSocket(s, protocol, port);
gsfan 0:bf663118b11b 40 }
gsfan 0:bf663118b11b 41 else {
gsfan 0:bf663118b11b 42 local_port++; // if don't set the source port, set local_port number.
gsfan 0:bf663118b11b 43 configSocket(s, protocol, local_port);
gsfan 0:bf663118b11b 44 }
gsfan 0:bf663118b11b 45
gsfan 0:bf663118b11b 46 //W5100.execCmdSn(s, Sock_OPEN);
gsfan 0:bf663118b11b 47
gsfan 0:bf663118b11b 48 return 1;
gsfan 0:bf663118b11b 49 }
gsfan 0:bf663118b11b 50
gsfan 0:bf663118b11b 51 return 0;
gsfan 0:bf663118b11b 52 }
gsfan 0:bf663118b11b 53
gsfan 0:bf663118b11b 54
gsfan 0:bf663118b11b 55 /**
gsfan 0:bf663118b11b 56 * @brief This function close the socket and parameter is "s" which represent the socket number
gsfan 0:bf663118b11b 57 */
gsfan 0:bf663118b11b 58 void GSSocket::close(SOCKET s)
gsfan 0:bf663118b11b 59 {
gsfan 0:bf663118b11b 60 execSocketCmd(s, CMD_CLOSE_CONN);
gsfan 0:bf663118b11b 61 }
gsfan 0:bf663118b11b 62
gsfan 0:bf663118b11b 63
gsfan 0:bf663118b11b 64 /**
gsfan 0:bf663118b11b 65 * @brief This function established the connection for the channel in passive (server) mode. This function waits for the request from the peer.
gsfan 0:bf663118b11b 66 * @return 1 for success else 0.
gsfan 0:bf663118b11b 67 */
gsfan 0:bf663118b11b 68 int GSSocket::listen(SOCKET s)
gsfan 0:bf663118b11b 69 {
gsfan 0:bf663118b11b 70 if (readSocketStatus(s) != SOCK_STATUS::INIT)
gsfan 0:bf663118b11b 71 return 0;
gsfan 0:bf663118b11b 72 execSocketCmd(s, CMD_LISTEN);
gsfan 0:bf663118b11b 73 return 1;
gsfan 0:bf663118b11b 74 }
gsfan 0:bf663118b11b 75
gsfan 0:bf663118b11b 76 int GSSocket::recv(SOCKET s, uint8_t *buf, int len)
gsfan 0:bf663118b11b 77 {
gsfan 0:bf663118b11b 78 int ret=0;
gsfan 0:bf663118b11b 79
gsfan 0:bf663118b11b 80 if ( (len > 0) && isDataOnSock(s))
gsfan 0:bf663118b11b 81 {
gsfan 0:bf663118b11b 82 ret = readData(s, buf, len);
gsfan 0:bf663118b11b 83 }
gsfan 0:bf663118b11b 84
gsfan 0:bf663118b11b 85 return ret;
gsfan 0:bf663118b11b 86 }
gsfan 0:bf663118b11b 87
gsfan 0:bf663118b11b 88 void GSSocket::disconnect(SOCKET s)
gsfan 0:bf663118b11b 89 {
gsfan 0:bf663118b11b 90 execSocketCmd(s, CMD_CLOSE_CONN);
gsfan 0:bf663118b11b 91 }
gsfan 0:bf663118b11b 92
gsfan 0:bf663118b11b 93 int GSSocket::send(SOCKET s, const uint8_t *buf, int len)
gsfan 0:bf663118b11b 94 {
gsfan 0:bf663118b11b 95 // int status=0;
gsfan 0:bf663118b11b 96 int ret=0;
gsfan 0:bf663118b11b 97 // int freesize=0;
gsfan 0:bf663118b11b 98
gsfan 0:bf663118b11b 99 if (len > SSIZE) {
gsfan 0:bf663118b11b 100 ret = SSIZE; // check size not to exceed MAX size.
gsfan 0:bf663118b11b 101 } else {
gsfan 0:bf663118b11b 102 ret = len;
gsfan 0:bf663118b11b 103 }
gsfan 0:bf663118b11b 104 ret = writeData(s, buf, len);
gsfan 0:bf663118b11b 105
gsfan 0:bf663118b11b 106 return ret;
gsfan 0:bf663118b11b 107 }
gsfan 0:bf663118b11b 108
gsfan 0:bf663118b11b 109 /**
gsfan 0:bf663118b11b 110 * @brief This function established the connection for the channel in Active (client) mode.
gsfan 0:bf663118b11b 111 * This function waits for the untill the connection is established.
gsfan 0:bf663118b11b 112 *
gsfan 0:bf663118b11b 113 * @return 1 for success else 0.
gsfan 0:bf663118b11b 114 */
gsfan 0:bf663118b11b 115 int GSSocket::connect(SOCKET s, Host &host)
gsfan 0:bf663118b11b 116 {
gsfan 0:bf663118b11b 117 if (host.getIp().isNull()) {
gsfan 0:bf663118b11b 118 DBG("dns_lookup %s\r\n", host.getName());
gsfan 0:bf663118b11b 119 if (!dns_lookup(host)) {
gsfan 0:bf663118b11b 120 wait_ms(50);
gsfan 0:bf663118b11b 121 if (!dns_lookup(host)) {
gsfan 0:bf663118b11b 122 DBG("error dns\r\n");
gsfan 0:bf663118b11b 123 return 0;
gsfan 0:bf663118b11b 124 }
gsfan 0:bf663118b11b 125 }
gsfan 0:bf663118b11b 126 }
gsfan 0:bf663118b11b 127
gsfan 0:bf663118b11b 128 if (host.getIp().isNull() || host.getPort() == 0)
gsfan 0:bf663118b11b 129 return 0;
gsfan 0:bf663118b11b 130
gsfan 0:bf663118b11b 131 // set destination IP
gsfan 0:bf663118b11b 132 return connect_socket(host);
gsfan 0:bf663118b11b 133 }