W5200(WIZ820io) network interface
MyNetTcpSocket.cpp@0:61831b843b44, 2012-04-14 (annotated)
- Committer:
- va009039
- Date:
- Sat Apr 14 17:21:11 2012 +0000
- Revision:
- 0:61831b843b44
- Child:
- 1:803123933c5a
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
va009039 | 0:61831b843b44 | 1 | // MyNetTcpSocket.cpp 2012/4/15 |
va009039 | 0:61831b843b44 | 2 | #include "mbed.h" |
va009039 | 0:61831b843b44 | 3 | #include "w5100.h" |
va009039 | 0:61831b843b44 | 4 | #include "MyNetTcpSocket.h" |
va009039 | 0:61831b843b44 | 5 | |
va009039 | 0:61831b843b44 | 6 | #define DEBUG |
va009039 | 0:61831b843b44 | 7 | |
va009039 | 0:61831b843b44 | 8 | #ifdef DEBUG |
va009039 | 0:61831b843b44 | 9 | #include "Utils.h" |
va009039 | 0:61831b843b44 | 10 | #define PRINT_FUNC() printf("%p %d:%s\n", this,__LINE__,__PRETTY_FUNCTION__) |
va009039 | 0:61831b843b44 | 11 | #else //DEBUG |
va009039 | 0:61831b843b44 | 12 | #define PRINT_FUNC() |
va009039 | 0:61831b843b44 | 13 | #endif //DEBUG |
va009039 | 0:61831b843b44 | 14 | |
va009039 | 0:61831b843b44 | 15 | MyNetTcpSocket::MyNetTcpSocket() : NetTcpSocket() { |
va009039 | 0:61831b843b44 | 16 | PRINT_FUNC(); |
va009039 | 0:61831b843b44 | 17 | _socket = 1; |
va009039 | 0:61831b843b44 | 18 | W5100.writeSnMR(_socket, SnMR:: TCP); // set TCP mode |
va009039 | 0:61831b843b44 | 19 | } |
va009039 | 0:61831b843b44 | 20 | |
va009039 | 0:61831b843b44 | 21 | MyNetTcpSocket::~MyNetTcpSocket() { |
va009039 | 0:61831b843b44 | 22 | PRINT_FUNC(); |
va009039 | 0:61831b843b44 | 23 | } |
va009039 | 0:61831b843b44 | 24 | |
va009039 | 0:61831b843b44 | 25 | NetTcpSocketErr MyNetTcpSocket::bind(const Host& me) { |
va009039 | 0:61831b843b44 | 26 | PRINT_FUNC(); |
va009039 | 0:61831b843b44 | 27 | int port = me.getPort(); |
va009039 | 0:61831b843b44 | 28 | W5100.writeSnPORT(_socket, port); |
va009039 | 0:61831b843b44 | 29 | return NETTCPSOCKET_OK; |
va009039 | 0:61831b843b44 | 30 | } |
va009039 | 0:61831b843b44 | 31 | |
va009039 | 0:61831b843b44 | 32 | NetTcpSocketErr MyNetTcpSocket::listen() { |
va009039 | 0:61831b843b44 | 33 | PRINT_FUNC(); |
va009039 | 0:61831b843b44 | 34 | W5100.execCmdSn(_socket, Sock_OPEN); // set OPEN command |
va009039 | 0:61831b843b44 | 35 | W5100.execCmdSn(_socket, Sock_LISTEN); // listen |
va009039 | 0:61831b843b44 | 36 | #ifdef DEBUG |
va009039 | 0:61831b843b44 | 37 | uint8_t ip[4]; |
va009039 | 0:61831b843b44 | 38 | printf("socket:%d SnMR:%02x SnIR:%02x SnSR:%02x\n", _socket, |
va009039 | 0:61831b843b44 | 39 | W5100.readSnMR(_socket), W5100.readSnIR(_socket), W5100.readSnSR(_socket)); |
va009039 | 0:61831b843b44 | 40 | W5100.getIPAddress(ip); |
va009039 | 0:61831b843b44 | 41 | printf("SIPR: %d.%d.%d.%d Sn_PORT:%d\n", ip[0], ip[1], ip[2], ip[3], W5100.readSnPORT(_socket)); |
va009039 | 0:61831b843b44 | 42 | #endif //DEBUG |
va009039 | 0:61831b843b44 | 43 | return NETTCPSOCKET_OK; |
va009039 | 0:61831b843b44 | 44 | } |
va009039 | 0:61831b843b44 | 45 | |
va009039 | 0:61831b843b44 | 46 | NetTcpSocketErr MyNetTcpSocket::connect(const Host& host) { |
va009039 | 0:61831b843b44 | 47 | PRINT_FUNC(); |
va009039 | 0:61831b843b44 | 48 | uint8_t ip[4]; |
va009039 | 0:61831b843b44 | 49 | ip[0] = host.getIp()[0]; |
va009039 | 0:61831b843b44 | 50 | ip[1] = host.getIp()[1]; |
va009039 | 0:61831b843b44 | 51 | ip[2] = host.getIp()[2]; |
va009039 | 0:61831b843b44 | 52 | ip[3] = host.getIp()[3]; |
va009039 | 0:61831b843b44 | 53 | int port = host.getPort(); |
va009039 | 0:61831b843b44 | 54 | W5100.writeSnDIPR(_socket, ip); |
va009039 | 0:61831b843b44 | 55 | W5100.writeSnDPORT(_socket, port); |
va009039 | 0:61831b843b44 | 56 | if (W5100.readSnPORT(_socket) == 0) { |
va009039 | 0:61831b843b44 | 57 | W5100.writeSnPORT(_socket, 1024 + _socket); |
va009039 | 0:61831b843b44 | 58 | } |
va009039 | 0:61831b843b44 | 59 | W5100.execCmdSn(_socket, Sock_OPEN); // set OPEN command |
va009039 | 0:61831b843b44 | 60 | W5100.execCmdSn(_socket, Sock_CONNECT); |
va009039 | 0:61831b843b44 | 61 | #ifdef DEBUG |
va009039 | 0:61831b843b44 | 62 | printf("socket:%d SnMR:%02x SnIR:%02x SnSR:%02x\n", _socket, |
va009039 | 0:61831b843b44 | 63 | W5100.readSnMR(_socket), W5100.readSnIR(_socket), W5100.readSnSR(_socket)); |
va009039 | 0:61831b843b44 | 64 | W5100.getIPAddress(ip); |
va009039 | 0:61831b843b44 | 65 | printf("SIPR: %d.%d.%d.%d Sn_PORT:%d\n", ip[0], ip[1], ip[2], ip[3], W5100.readSnPORT(_socket)); |
va009039 | 0:61831b843b44 | 66 | W5100.readSnDIPR(_socket, ip); |
va009039 | 0:61831b843b44 | 67 | 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 | 68 | #endif //DEBUG |
va009039 | 0:61831b843b44 | 69 | return NETTCPSOCKET_OK; |
va009039 | 0:61831b843b44 | 70 | } |
va009039 | 0:61831b843b44 | 71 | |
va009039 | 0:61831b843b44 | 72 | NetTcpSocketErr MyNetTcpSocket::accept(Host* pClient, NetTcpSocket** ppNewNetTcpSocket) { |
va009039 | 0:61831b843b44 | 73 | PRINT_FUNC(); |
va009039 | 0:61831b843b44 | 74 | uint8_t ip[4]; |
va009039 | 0:61831b843b44 | 75 | W5100.readSnDIPR(_socket, ip); |
va009039 | 0:61831b843b44 | 76 | pClient->setIp(IpAddr(ip[0],ip[1],ip[2],ip[3])); |
va009039 | 0:61831b843b44 | 77 | int port = W5100.readSnDPORT(_socket); |
va009039 | 0:61831b843b44 | 78 | pClient->setPort(port); |
va009039 | 0:61831b843b44 | 79 | |
va009039 | 0:61831b843b44 | 80 | return NETTCPSOCKET_OK; |
va009039 | 0:61831b843b44 | 81 | } |
va009039 | 0:61831b843b44 | 82 | |
va009039 | 0:61831b843b44 | 83 | int /*if < 0 : NetTcpSocketErr*/ MyNetTcpSocket::send(const char* buf, int len) { |
va009039 | 0:61831b843b44 | 84 | PRINT_FUNC(); |
va009039 | 0:61831b843b44 | 85 | #ifdef DEBUG |
va009039 | 0:61831b843b44 | 86 | printf("buf:%p, len=%d\n", buf, len); |
va009039 | 0:61831b843b44 | 87 | printHex((u8*)buf, len); |
va009039 | 0:61831b843b44 | 88 | #endif //DEBUG |
va009039 | 0:61831b843b44 | 89 | if (len > 0) { |
va009039 | 0:61831b843b44 | 90 | W5100.send_data_processing(_socket, (uint8_t*)buf, len); |
va009039 | 0:61831b843b44 | 91 | W5100.execCmdSn(_socket, Sock_SEND); |
va009039 | 0:61831b843b44 | 92 | } |
va009039 | 0:61831b843b44 | 93 | return len; |
va009039 | 0:61831b843b44 | 94 | } |
va009039 | 0:61831b843b44 | 95 | |
va009039 | 0:61831b843b44 | 96 | int /*if < 0 : NetTcpSocketErr*/ MyNetTcpSocket::recv(char* buf, int len){ |
va009039 | 0:61831b843b44 | 97 | PRINT_FUNC(); |
va009039 | 0:61831b843b44 | 98 | int size = W5100.getRXReceivedSize(_socket); |
va009039 | 0:61831b843b44 | 99 | if (size > len) { |
va009039 | 0:61831b843b44 | 100 | size = len; |
va009039 | 0:61831b843b44 | 101 | } |
va009039 | 0:61831b843b44 | 102 | if (size > 0) { |
va009039 | 0:61831b843b44 | 103 | W5100.recv_data_processing(_socket, (uint8_t*)buf, size); |
va009039 | 0:61831b843b44 | 104 | W5100.execCmdSn(_socket, Sock_RECV); |
va009039 | 0:61831b843b44 | 105 | } |
va009039 | 0:61831b843b44 | 106 | #ifdef DEBUG |
va009039 | 0:61831b843b44 | 107 | printHex((uint8_t*)buf, size); |
va009039 | 0:61831b843b44 | 108 | #endif //DEBUG |
va009039 | 0:61831b843b44 | 109 | return size; |
va009039 | 0:61831b843b44 | 110 | } |
va009039 | 0:61831b843b44 | 111 | |
va009039 | 0:61831b843b44 | 112 | NetTcpSocketErr MyNetTcpSocket::close() { |
va009039 | 0:61831b843b44 | 113 | PRINT_FUNC(); |
va009039 | 0:61831b843b44 | 114 | if(m_closed) { |
va009039 | 0:61831b843b44 | 115 | return NETTCPSOCKET_OK; |
va009039 | 0:61831b843b44 | 116 | } |
va009039 | 0:61831b843b44 | 117 | m_closed = true; |
va009039 | 0:61831b843b44 | 118 | cleanUp(); |
va009039 | 0:61831b843b44 | 119 | W5100.execCmdSn(_socket, Sock_DISCON); |
va009039 | 0:61831b843b44 | 120 | W5100.execCmdSn(_socket, Sock_CLOSE); |
va009039 | 0:61831b843b44 | 121 | return NETTCPSOCKET_OK; |
va009039 | 0:61831b843b44 | 122 | } |
va009039 | 0:61831b843b44 | 123 | |
va009039 | 0:61831b843b44 | 124 | NetTcpSocketErr MyNetTcpSocket::poll(){ |
va009039 | 0:61831b843b44 | 125 | PRINT_FUNC(); |
va009039 | 0:61831b843b44 | 126 | NetTcpSocket::flushEvents(); |
va009039 | 0:61831b843b44 | 127 | #ifdef DEBUG |
va009039 | 0:61831b843b44 | 128 | printf("socket:%d SnMR:%02x SnIR:%02x SnSR:%02x\n", _socket, |
va009039 | 0:61831b843b44 | 129 | W5100.readSnMR(_socket), W5100.readSnIR(_socket), W5100.readSnSR(_socket)); |
va009039 | 0:61831b843b44 | 130 | uint8_t ip[4]; |
va009039 | 0:61831b843b44 | 131 | W5100.readSnDIPR(_socket, ip); |
va009039 | 0:61831b843b44 | 132 | 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 | 133 | printf("Sn_RX_RSR:%d, Sn_RX_RD:%d, Sn_RX_WR:%d\n", |
va009039 | 0:61831b843b44 | 134 | W5100.readSnRX_RSR(_socket), W5100.readSnRX_RD(_socket), W5100.readSnRX_WR(_socket)); |
va009039 | 0:61831b843b44 | 135 | printf("Sn_TX_FSR:%d, Sn_TX_RD:%d, Sn_TX_WR:%d\n", |
va009039 | 0:61831b843b44 | 136 | W5100.readSnTX_FSR(_socket), W5100.readSnTX_RD(_socket), W5100.readSnTX_WR(_socket)); |
va009039 | 0:61831b843b44 | 137 | wait_ms(500); |
va009039 | 0:61831b843b44 | 138 | #endif //DEBUG |
va009039 | 0:61831b843b44 | 139 | if (W5100.readSnSR(_socket) == 0x1c) { |
va009039 | 0:61831b843b44 | 140 | queueEvent(NETTCPSOCKET_CONRST); |
va009039 | 0:61831b843b44 | 141 | } |
va009039 | 0:61831b843b44 | 142 | if (W5100.getRXReceivedSize(_socket) > 0) { |
va009039 | 0:61831b843b44 | 143 | queueEvent(NETTCPSOCKET_READABLE); |
va009039 | 0:61831b843b44 | 144 | } |
va009039 | 0:61831b843b44 | 145 | if (W5100.readSnSR(_socket) == 0x17) { |
va009039 | 0:61831b843b44 | 146 | queueEvent(NETTCPSOCKET_CONNECTED); |
va009039 | 0:61831b843b44 | 147 | if (W5100.getTXFreeSize(_socket) > 0) { |
va009039 | 0:61831b843b44 | 148 | queueEvent(NETTCPSOCKET_WRITEABLE); |
va009039 | 0:61831b843b44 | 149 | } |
va009039 | 0:61831b843b44 | 150 | } |
va009039 | 0:61831b843b44 | 151 | return NETTCPSOCKET_OK; |
va009039 | 0:61831b843b44 | 152 | } |
va009039 | 0:61831b843b44 | 153 | |
va009039 | 0:61831b843b44 | 154 | void MyNetTcpSocket::cleanUp() //Flush input buffer |
va009039 | 0:61831b843b44 | 155 | { |
va009039 | 0:61831b843b44 | 156 | PRINT_FUNC(); |
va009039 | 0:61831b843b44 | 157 | while(1) { |
va009039 | 0:61831b843b44 | 158 | int len = W5100.getRXReceivedSize(_socket); |
va009039 | 0:61831b843b44 | 159 | if (len <= 0) { |
va009039 | 0:61831b843b44 | 160 | break; |
va009039 | 0:61831b843b44 | 161 | } |
va009039 | 0:61831b843b44 | 162 | uint8_t temp[8]; |
va009039 | 0:61831b843b44 | 163 | W5100.recv_data_processing(_socket, temp, sizeof(temp)); |
va009039 | 0:61831b843b44 | 164 | W5100.execCmdSn(_socket, Sock_RECV); |
va009039 | 0:61831b843b44 | 165 | } |
va009039 | 0:61831b843b44 | 166 | } |