W5200(WIZ820io) network interface
Diff: MyNetTcpSocket.cpp
- Revision:
- 0:61831b843b44
- Child:
- 1:803123933c5a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MyNetTcpSocket.cpp Sat Apr 14 17:21:11 2012 +0000 @@ -0,0 +1,166 @@ +// MyNetTcpSocket.cpp 2012/4/15 +#include "mbed.h" +#include "w5100.h" +#include "MyNetTcpSocket.h" + +#define DEBUG + +#ifdef DEBUG +#include "Utils.h" +#define PRINT_FUNC() printf("%p %d:%s\n", this,__LINE__,__PRETTY_FUNCTION__) +#else //DEBUG +#define PRINT_FUNC() +#endif //DEBUG + +MyNetTcpSocket::MyNetTcpSocket() : NetTcpSocket() { + PRINT_FUNC(); + _socket = 1; + W5100.writeSnMR(_socket, SnMR:: TCP); // set TCP mode +} + +MyNetTcpSocket::~MyNetTcpSocket() { + PRINT_FUNC(); +} + +NetTcpSocketErr MyNetTcpSocket::bind(const Host& me) { + PRINT_FUNC(); + int port = me.getPort(); + W5100.writeSnPORT(_socket, port); + return NETTCPSOCKET_OK; +} + +NetTcpSocketErr MyNetTcpSocket::listen() { + PRINT_FUNC(); + W5100.execCmdSn(_socket, Sock_OPEN); // set OPEN command + W5100.execCmdSn(_socket, Sock_LISTEN); // listen +#ifdef DEBUG + uint8_t ip[4]; + printf("socket:%d SnMR:%02x SnIR:%02x SnSR:%02x\n", _socket, + W5100.readSnMR(_socket), W5100.readSnIR(_socket), W5100.readSnSR(_socket)); + W5100.getIPAddress(ip); + printf("SIPR: %d.%d.%d.%d Sn_PORT:%d\n", ip[0], ip[1], ip[2], ip[3], W5100.readSnPORT(_socket)); +#endif //DEBUG + return NETTCPSOCKET_OK; +} + +NetTcpSocketErr MyNetTcpSocket::connect(const Host& host) { + PRINT_FUNC(); + uint8_t ip[4]; + ip[0] = host.getIp()[0]; + ip[1] = host.getIp()[1]; + ip[2] = host.getIp()[2]; + ip[3] = host.getIp()[3]; + int port = host.getPort(); + W5100.writeSnDIPR(_socket, ip); + W5100.writeSnDPORT(_socket, port); + if (W5100.readSnPORT(_socket) == 0) { + W5100.writeSnPORT(_socket, 1024 + _socket); + } + W5100.execCmdSn(_socket, Sock_OPEN); // set OPEN command + W5100.execCmdSn(_socket, Sock_CONNECT); +#ifdef DEBUG + printf("socket:%d SnMR:%02x SnIR:%02x SnSR:%02x\n", _socket, + W5100.readSnMR(_socket), W5100.readSnIR(_socket), W5100.readSnSR(_socket)); + W5100.getIPAddress(ip); + printf("SIPR: %d.%d.%d.%d Sn_PORT:%d\n", ip[0], ip[1], ip[2], ip[3], W5100.readSnPORT(_socket)); + W5100.readSnDIPR(_socket, ip); + printf("Sn_DIPR: %d.%d.%d.%d Sn_DPORT:%d\n", ip[0], ip[1], ip[2], ip[3], W5100.readSnDPORT(_socket)); +#endif //DEBUG + return NETTCPSOCKET_OK; +} + +NetTcpSocketErr MyNetTcpSocket::accept(Host* pClient, NetTcpSocket** ppNewNetTcpSocket) { + PRINT_FUNC(); + uint8_t ip[4]; + W5100.readSnDIPR(_socket, ip); + pClient->setIp(IpAddr(ip[0],ip[1],ip[2],ip[3])); + int port = W5100.readSnDPORT(_socket); + pClient->setPort(port); + + return NETTCPSOCKET_OK; +} + +int /*if < 0 : NetTcpSocketErr*/ MyNetTcpSocket::send(const char* buf, int len) { + PRINT_FUNC(); +#ifdef DEBUG + printf("buf:%p, len=%d\n", buf, len); + printHex((u8*)buf, len); +#endif //DEBUG + if (len > 0) { + W5100.send_data_processing(_socket, (uint8_t*)buf, len); + W5100.execCmdSn(_socket, Sock_SEND); + } + return len; +} + +int /*if < 0 : NetTcpSocketErr*/ MyNetTcpSocket::recv(char* buf, int len){ + PRINT_FUNC(); + int size = W5100.getRXReceivedSize(_socket); + if (size > len) { + size = len; + } + if (size > 0) { + W5100.recv_data_processing(_socket, (uint8_t*)buf, size); + W5100.execCmdSn(_socket, Sock_RECV); + } +#ifdef DEBUG + printHex((uint8_t*)buf, size); +#endif //DEBUG + return size; +} + +NetTcpSocketErr MyNetTcpSocket::close() { + PRINT_FUNC(); + if(m_closed) { + return NETTCPSOCKET_OK; + } + m_closed = true; + cleanUp(); + W5100.execCmdSn(_socket, Sock_DISCON); + W5100.execCmdSn(_socket, Sock_CLOSE); + return NETTCPSOCKET_OK; +} + +NetTcpSocketErr MyNetTcpSocket::poll(){ + PRINT_FUNC(); + NetTcpSocket::flushEvents(); +#ifdef DEBUG + printf("socket:%d SnMR:%02x SnIR:%02x SnSR:%02x\n", _socket, + W5100.readSnMR(_socket), W5100.readSnIR(_socket), W5100.readSnSR(_socket)); + uint8_t ip[4]; + W5100.readSnDIPR(_socket, ip); + printf("Sn_DIPR: %d.%d.%d.%d Sn_DPORT: %d\n", ip[0], ip[1], ip[2], ip[3], W5100.readSnDPORT(_socket)); + printf("Sn_RX_RSR:%d, Sn_RX_RD:%d, Sn_RX_WR:%d\n", + W5100.readSnRX_RSR(_socket), W5100.readSnRX_RD(_socket), W5100.readSnRX_WR(_socket)); + printf("Sn_TX_FSR:%d, Sn_TX_RD:%d, Sn_TX_WR:%d\n", + W5100.readSnTX_FSR(_socket), W5100.readSnTX_RD(_socket), W5100.readSnTX_WR(_socket)); + wait_ms(500); +#endif //DEBUG + if (W5100.readSnSR(_socket) == 0x1c) { + queueEvent(NETTCPSOCKET_CONRST); + } + if (W5100.getRXReceivedSize(_socket) > 0) { + queueEvent(NETTCPSOCKET_READABLE); + } + if (W5100.readSnSR(_socket) == 0x17) { + queueEvent(NETTCPSOCKET_CONNECTED); + if (W5100.getTXFreeSize(_socket) > 0) { + queueEvent(NETTCPSOCKET_WRITEABLE); + } + } + return NETTCPSOCKET_OK; +} + +void MyNetTcpSocket::cleanUp() //Flush input buffer +{ + PRINT_FUNC(); + while(1) { + int len = W5100.getRXReceivedSize(_socket); + if (len <= 0) { + break; + } + uint8_t temp[8]; + W5100.recv_data_processing(_socket, temp, sizeof(temp)); + W5100.execCmdSn(_socket, Sock_RECV); + } +}