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/
Wirefree/socket.cpp@0:bf663118b11b, 2012-05-27 (annotated)
- Committer:
- gsfan
- Date:
- Sun May 27 03:19:54 2012 +0000
- Revision:
- 0:bf663118b11b
Who changed what in which revision?
User | Revision | Line number | New 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 | } |