W5200(WIZ820io) network interface
MyNetTcpSocket.cpp
- Committer:
- va009039
- Date:
- 2012-04-14
- Revision:
- 0:61831b843b44
- Child:
- 1:803123933c5a
File content as of revision 0:61831b843b44:
// 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); } }