W5200(WIZ820io) network interface
MyNetTcpSocket.cpp@2:a8df39b4f3aa, 2012-04-19 (annotated)
- Committer:
- va009039
- Date:
- Thu Apr 19 11:14:43 2012 +0000
- Revision:
- 2:a8df39b4f3aa
- Parent:
- 1:803123933c5a
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
va009039 | 2:a8df39b4f3aa | 1 | // MyNetTcpSocket.cpp 2012/4/19 |
va009039 | 0:61831b843b44 | 2 | #include "mbed.h" |
va009039 | 0:61831b843b44 | 3 | #include "w5100.h" |
va009039 | 0:61831b843b44 | 4 | #include "MyNetTcpSocket.h" |
va009039 | 2:a8df39b4f3aa | 5 | //#define __DEBUG |
va009039 | 1:803123933c5a | 6 | #include "dbg/dbg.h" |
va009039 | 0:61831b843b44 | 7 | |
va009039 | 2:a8df39b4f3aa | 8 | #ifdef __DEBUG |
va009039 | 2:a8df39b4f3aa | 9 | #define DBG2(...) do{ DebugStream::debug("%p %s ", this,__PRETTY_FUNCTION__); DebugStream::debug(__VA_ARGS__); } while(0); |
va009039 | 2:a8df39b4f3aa | 10 | #else |
va009039 | 2:a8df39b4f3aa | 11 | #define DBG2(...) while(0); |
va009039 | 2:a8df39b4f3aa | 12 | #endif //__DEBUG |
va009039 | 2:a8df39b4f3aa | 13 | |
va009039 | 1:803123933c5a | 14 | //#define DEBUG |
va009039 | 0:61831b843b44 | 15 | |
va009039 | 0:61831b843b44 | 16 | #ifdef DEBUG |
va009039 | 0:61831b843b44 | 17 | #include "Utils.h" |
va009039 | 0:61831b843b44 | 18 | #define PRINT_FUNC() printf("%p %d:%s\n", this,__LINE__,__PRETTY_FUNCTION__) |
va009039 | 0:61831b843b44 | 19 | #else //DEBUG |
va009039 | 0:61831b843b44 | 20 | #define PRINT_FUNC() |
va009039 | 0:61831b843b44 | 21 | #endif //DEBUG |
va009039 | 0:61831b843b44 | 22 | |
va009039 | 1:803123933c5a | 23 | int w5200_new_socket() |
va009039 | 1:803123933c5a | 24 | { |
va009039 | 1:803123933c5a | 25 | for(int i = 0; i < MAX_SOCK_NUM; i++) { |
va009039 | 1:803123933c5a | 26 | if (W5100.readSnMR(i) == SnMR::CLOSE) { // 0x00 |
va009039 | 1:803123933c5a | 27 | if (W5100.readSnSR(i) != SnSR::LISTEN) { // 0x14 |
va009039 | 1:803123933c5a | 28 | return i; |
va009039 | 1:803123933c5a | 29 | } |
va009039 | 1:803123933c5a | 30 | } |
va009039 | 1:803123933c5a | 31 | } |
va009039 | 1:803123933c5a | 32 | return -1; // not found |
va009039 | 1:803123933c5a | 33 | } |
va009039 | 1:803123933c5a | 34 | |
va009039 | 1:803123933c5a | 35 | MyNetTcpSocket::MyNetTcpSocket(int socket) : NetTcpSocket(),_socket(socket),wait_accept(false) { |
va009039 | 0:61831b843b44 | 36 | PRINT_FUNC(); |
va009039 | 2:a8df39b4f3aa | 37 | DBG2("socket: %d\n", socket); |
va009039 | 1:803123933c5a | 38 | if (_socket == (-1)) { |
va009039 | 1:803123933c5a | 39 | _socket = w5200_new_socket(); |
va009039 | 1:803123933c5a | 40 | } |
va009039 | 1:803123933c5a | 41 | #ifdef DEBUG |
va009039 | 1:803123933c5a | 42 | printf("%p socket: %d\n", this, _socket); |
va009039 | 1:803123933c5a | 43 | #endif //DEBUG |
va009039 | 1:803123933c5a | 44 | if (_socket != (-1)) { |
va009039 | 1:803123933c5a | 45 | W5100.writeSnMR(_socket, SnMR::TCP); // set TCP mode |
va009039 | 1:803123933c5a | 46 | } |
va009039 | 0:61831b843b44 | 47 | } |
va009039 | 0:61831b843b44 | 48 | |
va009039 | 0:61831b843b44 | 49 | MyNetTcpSocket::~MyNetTcpSocket() { |
va009039 | 0:61831b843b44 | 50 | PRINT_FUNC(); |
va009039 | 2:a8df39b4f3aa | 51 | DBG2("socket=%d\n", _socket); |
va009039 | 1:803123933c5a | 52 | close(); |
va009039 | 1:803123933c5a | 53 | if (_socket != (-1)) { |
va009039 | 1:803123933c5a | 54 | W5100.writeSnMR(_socket, SnMR::CLOSE); |
va009039 | 1:803123933c5a | 55 | } |
va009039 | 0:61831b843b44 | 56 | } |
va009039 | 0:61831b843b44 | 57 | |
va009039 | 0:61831b843b44 | 58 | NetTcpSocketErr MyNetTcpSocket::bind(const Host& me) { |
va009039 | 0:61831b843b44 | 59 | PRINT_FUNC(); |
va009039 | 1:803123933c5a | 60 | if (_socket == (-1)) { |
va009039 | 1:803123933c5a | 61 | return NETTCPSOCKET_MEM; |
va009039 | 1:803123933c5a | 62 | } |
va009039 | 0:61831b843b44 | 63 | int port = me.getPort(); |
va009039 | 0:61831b843b44 | 64 | W5100.writeSnPORT(_socket, port); |
va009039 | 0:61831b843b44 | 65 | return NETTCPSOCKET_OK; |
va009039 | 0:61831b843b44 | 66 | } |
va009039 | 0:61831b843b44 | 67 | |
va009039 | 0:61831b843b44 | 68 | NetTcpSocketErr MyNetTcpSocket::listen() { |
va009039 | 0:61831b843b44 | 69 | PRINT_FUNC(); |
va009039 | 1:803123933c5a | 70 | if (_socket == (-1)) { |
va009039 | 1:803123933c5a | 71 | return NETTCPSOCKET_MEM; |
va009039 | 1:803123933c5a | 72 | } |
va009039 | 0:61831b843b44 | 73 | W5100.execCmdSn(_socket, Sock_OPEN); // set OPEN command |
va009039 | 0:61831b843b44 | 74 | W5100.execCmdSn(_socket, Sock_LISTEN); // listen |
va009039 | 0:61831b843b44 | 75 | #ifdef DEBUG |
va009039 | 0:61831b843b44 | 76 | uint8_t ip[4]; |
va009039 | 0:61831b843b44 | 77 | printf("socket:%d SnMR:%02x SnIR:%02x SnSR:%02x\n", _socket, |
va009039 | 0:61831b843b44 | 78 | W5100.readSnMR(_socket), W5100.readSnIR(_socket), W5100.readSnSR(_socket)); |
va009039 | 0:61831b843b44 | 79 | W5100.getIPAddress(ip); |
va009039 | 0:61831b843b44 | 80 | printf("SIPR: %d.%d.%d.%d Sn_PORT:%d\n", ip[0], ip[1], ip[2], ip[3], W5100.readSnPORT(_socket)); |
va009039 | 0:61831b843b44 | 81 | #endif //DEBUG |
va009039 | 1:803123933c5a | 82 | wait_accept = true; |
va009039 | 0:61831b843b44 | 83 | return NETTCPSOCKET_OK; |
va009039 | 0:61831b843b44 | 84 | } |
va009039 | 0:61831b843b44 | 85 | |
va009039 | 0:61831b843b44 | 86 | NetTcpSocketErr MyNetTcpSocket::connect(const Host& host) { |
va009039 | 0:61831b843b44 | 87 | PRINT_FUNC(); |
va009039 | 1:803123933c5a | 88 | if (_socket == (-1)) { |
va009039 | 1:803123933c5a | 89 | return NETTCPSOCKET_MEM; |
va009039 | 1:803123933c5a | 90 | } |
va009039 | 0:61831b843b44 | 91 | uint8_t ip[4]; |
va009039 | 0:61831b843b44 | 92 | ip[0] = host.getIp()[0]; |
va009039 | 0:61831b843b44 | 93 | ip[1] = host.getIp()[1]; |
va009039 | 0:61831b843b44 | 94 | ip[2] = host.getIp()[2]; |
va009039 | 0:61831b843b44 | 95 | ip[3] = host.getIp()[3]; |
va009039 | 0:61831b843b44 | 96 | int port = host.getPort(); |
va009039 | 0:61831b843b44 | 97 | W5100.writeSnDIPR(_socket, ip); |
va009039 | 0:61831b843b44 | 98 | W5100.writeSnDPORT(_socket, port); |
va009039 | 0:61831b843b44 | 99 | if (W5100.readSnPORT(_socket) == 0) { |
va009039 | 0:61831b843b44 | 100 | W5100.writeSnPORT(_socket, 1024 + _socket); |
va009039 | 0:61831b843b44 | 101 | } |
va009039 | 0:61831b843b44 | 102 | W5100.execCmdSn(_socket, Sock_OPEN); // set OPEN command |
va009039 | 0:61831b843b44 | 103 | W5100.execCmdSn(_socket, Sock_CONNECT); |
va009039 | 0:61831b843b44 | 104 | #ifdef DEBUG |
va009039 | 0:61831b843b44 | 105 | printf("socket:%d SnMR:%02x SnIR:%02x SnSR:%02x\n", _socket, |
va009039 | 0:61831b843b44 | 106 | W5100.readSnMR(_socket), W5100.readSnIR(_socket), W5100.readSnSR(_socket)); |
va009039 | 0:61831b843b44 | 107 | W5100.getIPAddress(ip); |
va009039 | 0:61831b843b44 | 108 | printf("SIPR: %d.%d.%d.%d Sn_PORT:%d\n", ip[0], ip[1], ip[2], ip[3], W5100.readSnPORT(_socket)); |
va009039 | 0:61831b843b44 | 109 | W5100.readSnDIPR(_socket, ip); |
va009039 | 0:61831b843b44 | 110 | printf("Sn_DIPR: %d.%d.%d.%d Sn_DPORT:%d\n", ip[0], ip[1], ip[2], ip[3], W5100.readSnDPORT(_socket)); |
va009039 | 0:61831b843b44 | 111 | #endif //DEBUG |
va009039 | 0:61831b843b44 | 112 | return NETTCPSOCKET_OK; |
va009039 | 0:61831b843b44 | 113 | } |
va009039 | 0:61831b843b44 | 114 | |
va009039 | 0:61831b843b44 | 115 | NetTcpSocketErr MyNetTcpSocket::accept(Host* pClient, NetTcpSocket** ppNewNetTcpSocket) { |
va009039 | 0:61831b843b44 | 116 | PRINT_FUNC(); |
va009039 | 1:803123933c5a | 117 | if (_socket == (-1)) { |
va009039 | 1:803123933c5a | 118 | return NETTCPSOCKET_MEM; |
va009039 | 1:803123933c5a | 119 | } |
va009039 | 0:61831b843b44 | 120 | uint8_t ip[4]; |
va009039 | 0:61831b843b44 | 121 | W5100.readSnDIPR(_socket, ip); |
va009039 | 0:61831b843b44 | 122 | pClient->setIp(IpAddr(ip[0],ip[1],ip[2],ip[3])); |
va009039 | 0:61831b843b44 | 123 | int port = W5100.readSnDPORT(_socket); |
va009039 | 0:61831b843b44 | 124 | pClient->setPort(port); |
va009039 | 1:803123933c5a | 125 | Host me; |
va009039 | 1:803123933c5a | 126 | me.setPort(W5100.readSnPORT(_socket)); |
va009039 | 2:a8df39b4f3aa | 127 | MyNetTcpSocket* pNewNetTcpSocket = new MyNetTcpSocket(_socket); |
va009039 | 2:a8df39b4f3aa | 128 | if (pNewNetTcpSocket == NULL) { |
va009039 | 2:a8df39b4f3aa | 129 | return NETTCPSOCKET_EMPTY; |
va009039 | 2:a8df39b4f3aa | 130 | } |
va009039 | 2:a8df39b4f3aa | 131 | pNewNetTcpSocket->m_refs++; |
va009039 | 2:a8df39b4f3aa | 132 | *ppNewNetTcpSocket = pNewNetTcpSocket; |
va009039 | 1:803123933c5a | 133 | _socket = w5200_new_socket(); |
va009039 | 1:803123933c5a | 134 | if (_socket != (-1)) { |
va009039 | 1:803123933c5a | 135 | W5100.writeSnMR(_socket, SnMR::TCP); // set TCP mode |
va009039 | 1:803123933c5a | 136 | bind(me); |
va009039 | 1:803123933c5a | 137 | listen(); |
va009039 | 1:803123933c5a | 138 | } |
va009039 | 0:61831b843b44 | 139 | return NETTCPSOCKET_OK; |
va009039 | 0:61831b843b44 | 140 | } |
va009039 | 0:61831b843b44 | 141 | |
va009039 | 0:61831b843b44 | 142 | int /*if < 0 : NetTcpSocketErr*/ MyNetTcpSocket::send(const char* buf, int len) { |
va009039 | 0:61831b843b44 | 143 | PRINT_FUNC(); |
va009039 | 0:61831b843b44 | 144 | #ifdef DEBUG |
va009039 | 0:61831b843b44 | 145 | printf("buf:%p, len=%d\n", buf, len); |
va009039 | 0:61831b843b44 | 146 | printHex((u8*)buf, len); |
va009039 | 0:61831b843b44 | 147 | #endif //DEBUG |
va009039 | 1:803123933c5a | 148 | if (_socket == (-1)) { |
va009039 | 1:803123933c5a | 149 | return NETTCPSOCKET_MEM; |
va009039 | 1:803123933c5a | 150 | } |
va009039 | 0:61831b843b44 | 151 | if (len > 0) { |
va009039 | 0:61831b843b44 | 152 | W5100.send_data_processing(_socket, (uint8_t*)buf, len); |
va009039 | 0:61831b843b44 | 153 | W5100.execCmdSn(_socket, Sock_SEND); |
va009039 | 0:61831b843b44 | 154 | } |
va009039 | 0:61831b843b44 | 155 | return len; |
va009039 | 0:61831b843b44 | 156 | } |
va009039 | 0:61831b843b44 | 157 | |
va009039 | 0:61831b843b44 | 158 | int /*if < 0 : NetTcpSocketErr*/ MyNetTcpSocket::recv(char* buf, int len){ |
va009039 | 0:61831b843b44 | 159 | PRINT_FUNC(); |
va009039 | 1:803123933c5a | 160 | if (_socket == (-1)) { |
va009039 | 1:803123933c5a | 161 | return NETTCPSOCKET_MEM; |
va009039 | 1:803123933c5a | 162 | } |
va009039 | 0:61831b843b44 | 163 | int size = W5100.getRXReceivedSize(_socket); |
va009039 | 0:61831b843b44 | 164 | if (size > len) { |
va009039 | 0:61831b843b44 | 165 | size = len; |
va009039 | 0:61831b843b44 | 166 | } |
va009039 | 0:61831b843b44 | 167 | if (size > 0) { |
va009039 | 0:61831b843b44 | 168 | W5100.recv_data_processing(_socket, (uint8_t*)buf, size); |
va009039 | 0:61831b843b44 | 169 | W5100.execCmdSn(_socket, Sock_RECV); |
va009039 | 0:61831b843b44 | 170 | } |
va009039 | 0:61831b843b44 | 171 | #ifdef DEBUG |
va009039 | 0:61831b843b44 | 172 | printHex((uint8_t*)buf, size); |
va009039 | 0:61831b843b44 | 173 | #endif //DEBUG |
va009039 | 0:61831b843b44 | 174 | return size; |
va009039 | 0:61831b843b44 | 175 | } |
va009039 | 0:61831b843b44 | 176 | |
va009039 | 0:61831b843b44 | 177 | NetTcpSocketErr MyNetTcpSocket::close() { |
va009039 | 0:61831b843b44 | 178 | PRINT_FUNC(); |
va009039 | 2:a8df39b4f3aa | 179 | DBG2("m_closed=%d m_refs=%d\n", m_closed, m_refs); |
va009039 | 0:61831b843b44 | 180 | if(m_closed) { |
va009039 | 0:61831b843b44 | 181 | return NETTCPSOCKET_OK; |
va009039 | 0:61831b843b44 | 182 | } |
va009039 | 0:61831b843b44 | 183 | m_closed = true; |
va009039 | 0:61831b843b44 | 184 | cleanUp(); |
va009039 | 1:803123933c5a | 185 | if (_socket != (-1)) { |
va009039 | 1:803123933c5a | 186 | W5100.execCmdSn(_socket, Sock_DISCON); |
va009039 | 1:803123933c5a | 187 | W5100.execCmdSn(_socket, Sock_CLOSE); |
va009039 | 1:803123933c5a | 188 | } |
va009039 | 0:61831b843b44 | 189 | return NETTCPSOCKET_OK; |
va009039 | 0:61831b843b44 | 190 | } |
va009039 | 0:61831b843b44 | 191 | |
va009039 | 0:61831b843b44 | 192 | NetTcpSocketErr MyNetTcpSocket::poll(){ |
va009039 | 0:61831b843b44 | 193 | PRINT_FUNC(); |
va009039 | 0:61831b843b44 | 194 | NetTcpSocket::flushEvents(); |
va009039 | 0:61831b843b44 | 195 | #ifdef DEBUG |
va009039 | 1:803123933c5a | 196 | printf("%p socket:%d\n", this,_socket); |
va009039 | 1:803123933c5a | 197 | if (_socket != (-1)) { |
va009039 | 1:803123933c5a | 198 | printf("SnMR:%02x SnIR:%02x SnSR:%02x\n", |
va009039 | 1:803123933c5a | 199 | W5100.readSnMR(_socket), W5100.readSnIR(_socket), W5100.readSnSR(_socket)); |
va009039 | 1:803123933c5a | 200 | uint8_t ip[4]; |
va009039 | 1:803123933c5a | 201 | W5100.readSnDIPR(_socket, ip); |
va009039 | 1:803123933c5a | 202 | printf("Sn_DIPR: %d.%d.%d.%d Sn_DPORT: %d\n", ip[0], ip[1], ip[2], ip[3], W5100.readSnDPORT(_socket)); |
va009039 | 1:803123933c5a | 203 | printf("Sn_RX_RSR:%5d, Sn_RX_RD:%5d, Sn_RX_WR:%5d\n", |
va009039 | 0:61831b843b44 | 204 | W5100.readSnRX_RSR(_socket), W5100.readSnRX_RD(_socket), W5100.readSnRX_WR(_socket)); |
va009039 | 1:803123933c5a | 205 | printf("Sn_TX_FSR:%5d, Sn_TX_RD:%5d, Sn_TX_WR:%5d\n", |
va009039 | 0:61831b843b44 | 206 | W5100.readSnTX_FSR(_socket), W5100.readSnTX_RD(_socket), W5100.readSnTX_WR(_socket)); |
va009039 | 1:803123933c5a | 207 | } |
va009039 | 1:803123933c5a | 208 | wait_ms(200); |
va009039 | 0:61831b843b44 | 209 | #endif //DEBUG |
va009039 | 1:803123933c5a | 210 | if (_socket == (-1)) { |
va009039 | 1:803123933c5a | 211 | return NETTCPSOCKET_OK; |
va009039 | 1:803123933c5a | 212 | } |
va009039 | 1:803123933c5a | 213 | uint8_t Sn_SR = W5100.readSnSR(_socket); |
va009039 | 1:803123933c5a | 214 | if (wait_accept) { |
va009039 | 1:803123933c5a | 215 | if (Sn_SR == 0x17) { |
va009039 | 1:803123933c5a | 216 | queueEvent(NETTCPSOCKET_ACCEPT); |
va009039 | 1:803123933c5a | 217 | wait_accept = false; |
va009039 | 1:803123933c5a | 218 | } |
va009039 | 1:803123933c5a | 219 | } |
va009039 | 1:803123933c5a | 220 | if (Sn_SR == 0x1c) { |
va009039 | 0:61831b843b44 | 221 | queueEvent(NETTCPSOCKET_CONRST); |
va009039 | 0:61831b843b44 | 222 | } |
va009039 | 0:61831b843b44 | 223 | if (W5100.getRXReceivedSize(_socket) > 0) { |
va009039 | 0:61831b843b44 | 224 | queueEvent(NETTCPSOCKET_READABLE); |
va009039 | 0:61831b843b44 | 225 | } |
va009039 | 1:803123933c5a | 226 | if (Sn_SR == 0x17) { |
va009039 | 0:61831b843b44 | 227 | queueEvent(NETTCPSOCKET_CONNECTED); |
va009039 | 0:61831b843b44 | 228 | if (W5100.getTXFreeSize(_socket) > 0) { |
va009039 | 0:61831b843b44 | 229 | queueEvent(NETTCPSOCKET_WRITEABLE); |
va009039 | 0:61831b843b44 | 230 | } |
va009039 | 0:61831b843b44 | 231 | } |
va009039 | 1:803123933c5a | 232 | if (Sn_SR == 0x00) { |
va009039 | 1:803123933c5a | 233 | queueEvent(NETTCPSOCKET_DISCONNECTED); |
va009039 | 1:803123933c5a | 234 | } |
va009039 | 0:61831b843b44 | 235 | return NETTCPSOCKET_OK; |
va009039 | 0:61831b843b44 | 236 | } |
va009039 | 0:61831b843b44 | 237 | |
va009039 | 0:61831b843b44 | 238 | void MyNetTcpSocket::cleanUp() //Flush input buffer |
va009039 | 0:61831b843b44 | 239 | { |
va009039 | 0:61831b843b44 | 240 | PRINT_FUNC(); |
va009039 | 1:803123933c5a | 241 | if (_socket == (-1)) { |
va009039 | 1:803123933c5a | 242 | return; |
va009039 | 1:803123933c5a | 243 | } |
va009039 | 1:803123933c5a | 244 | while(W5100.getRXReceivedSize(_socket) > 0) { |
va009039 | 1:803123933c5a | 245 | uint8_t temp[1]; |
va009039 | 1:803123933c5a | 246 | W5100.recv_data_processing(_socket, temp, 1); |
va009039 | 0:61831b843b44 | 247 | W5100.execCmdSn(_socket, Sock_RECV); |
va009039 | 1:803123933c5a | 248 | } |
va009039 | 0:61831b843b44 | 249 | } |