
DHCP Client for WIZ820io(W5200)
Dependencies: EthernetNetIf mbed
MyUDPSocket.h@0:db4242c89949, 2012-04-10 (annotated)
- Committer:
- va009039
- Date:
- Tue Apr 10 03:38:22 2012 +0000
- Revision:
- 0:db4242c89949
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
va009039 | 0:db4242c89949 | 1 | #ifndef MYUDPSOCKET_H |
va009039 | 0:db4242c89949 | 2 | #define MYUDPSOCKET_H |
va009039 | 0:db4242c89949 | 3 | #include "UDPSocket.h" |
va009039 | 0:db4242c89949 | 4 | |
va009039 | 0:db4242c89949 | 5 | #ifdef DEBUG |
va009039 | 0:db4242c89949 | 6 | #define PRINT_FUNC() printf("%d:%s\n", __LINE__,__PRETTY_FUNCTION__) |
va009039 | 0:db4242c89949 | 7 | #else //DEBUG |
va009039 | 0:db4242c89949 | 8 | #define PRINT_FUNC() |
va009039 | 0:db4242c89949 | 9 | #endif //DEBUG |
va009039 | 0:db4242c89949 | 10 | |
va009039 | 0:db4242c89949 | 11 | class MyUDPSocket { |
va009039 | 0:db4242c89949 | 12 | int _socket; |
va009039 | 0:db4242c89949 | 13 | void (*m_pCb)(UDPSocketEvent); |
va009039 | 0:db4242c89949 | 14 | public: |
va009039 | 0:db4242c89949 | 15 | MyUDPSocket() { |
va009039 | 0:db4242c89949 | 16 | _socket = 7; |
va009039 | 0:db4242c89949 | 17 | W5100.writeSnMR(_socket, SnMR::UDP); // set UDP mode |
va009039 | 0:db4242c89949 | 18 | } |
va009039 | 0:db4242c89949 | 19 | |
va009039 | 0:db4242c89949 | 20 | UDPSocketErr bind(const Host& me) { |
va009039 | 0:db4242c89949 | 21 | if (! me.getIp().isNull()) { |
va009039 | 0:db4242c89949 | 22 | uint8_t ip[4]; |
va009039 | 0:db4242c89949 | 23 | ip[0] = me.getIp()[0]; |
va009039 | 0:db4242c89949 | 24 | ip[1] = me.getIp()[1]; |
va009039 | 0:db4242c89949 | 25 | ip[2] = me.getIp()[2]; |
va009039 | 0:db4242c89949 | 26 | ip[3] = me.getIp()[3]; |
va009039 | 0:db4242c89949 | 27 | W5100.setIPAddress(ip); |
va009039 | 0:db4242c89949 | 28 | } |
va009039 | 0:db4242c89949 | 29 | int port = me.getPort(); |
va009039 | 0:db4242c89949 | 30 | if (port) { |
va009039 | 0:db4242c89949 | 31 | W5100.writeSnPORT(_socket, port); |
va009039 | 0:db4242c89949 | 32 | } |
va009039 | 0:db4242c89949 | 33 | W5100.execCmdSn( _socket, Sock_OPEN); // set OPEN command |
va009039 | 0:db4242c89949 | 34 | return UDPSOCKET_OK; |
va009039 | 0:db4242c89949 | 35 | } |
va009039 | 0:db4242c89949 | 36 | |
va009039 | 0:db4242c89949 | 37 | int /*if < 0 : UDPSocketErr*/ sendto(const char* buf, int len, Host* pHost) { |
va009039 | 0:db4242c89949 | 38 | #ifdef DEBUG |
va009039 | 0:db4242c89949 | 39 | PRINT_FUNC(); |
va009039 | 0:db4242c89949 | 40 | printHex((u8*)buf, len); |
va009039 | 0:db4242c89949 | 41 | #endif //DEBUG |
va009039 | 0:db4242c89949 | 42 | uint8_t ip[4]; |
va009039 | 0:db4242c89949 | 43 | ip[0] = pHost->getIp()[0]; |
va009039 | 0:db4242c89949 | 44 | ip[1] = pHost->getIp()[1]; |
va009039 | 0:db4242c89949 | 45 | ip[2] = pHost->getIp()[2]; |
va009039 | 0:db4242c89949 | 46 | ip[3] = pHost->getIp()[3]; |
va009039 | 0:db4242c89949 | 47 | int port = pHost->getPort(); |
va009039 | 0:db4242c89949 | 48 | W5100.writeSnDIPR(_socket, ip); |
va009039 | 0:db4242c89949 | 49 | W5100.writeSnDPORT(_socket, port); |
va009039 | 0:db4242c89949 | 50 | W5100.send_data_processing(_socket, (uint8_t*)buf, len); |
va009039 | 0:db4242c89949 | 51 | W5100.execCmdSn(_socket, Sock_SEND); |
va009039 | 0:db4242c89949 | 52 | #ifdef DEBUG |
va009039 | 0:db4242c89949 | 53 | W5100.getIPAddress(ip); |
va009039 | 0:db4242c89949 | 54 | printf("SIPR: %d.%d.%d.%d Sn_PORT:%d\n", ip[0], ip[1], ip[2], ip[3], W5100.readSnPORT(_socket)); |
va009039 | 0:db4242c89949 | 55 | W5100.readSnDIPR(_socket, ip); |
va009039 | 0:db4242c89949 | 56 | printf("Sn_DIPR: %d.%d.%d.%d Sn_DPORT:%d\n", ip[0], ip[1], ip[2], ip[3], W5100.readSnDPORT(_socket)); |
va009039 | 0:db4242c89949 | 57 | #endif //DEBUG |
va009039 | 0:db4242c89949 | 58 | return len; |
va009039 | 0:db4242c89949 | 59 | } |
va009039 | 0:db4242c89949 | 60 | |
va009039 | 0:db4242c89949 | 61 | int /*if < 0 : UDPSocketErr*/ recvfrom(char* buf, int len, Host* pHost) { |
va009039 | 0:db4242c89949 | 62 | int size = W5100.getRXReceivedSize(_socket); |
va009039 | 0:db4242c89949 | 63 | if (size < 8) { |
va009039 | 0:db4242c89949 | 64 | return -1; |
va009039 | 0:db4242c89949 | 65 | } |
va009039 | 0:db4242c89949 | 66 | uint8_t info[8]; |
va009039 | 0:db4242c89949 | 67 | W5100.recv_data_processing(_socket, info, 8); |
va009039 | 0:db4242c89949 | 68 | W5100.execCmdSn(_socket, Sock_RECV); |
va009039 | 0:db4242c89949 | 69 | pHost->setIp(IpAddr(info[0],info[1],info[2],info[3])); |
va009039 | 0:db4242c89949 | 70 | pHost->setPort(info[4]<<8|info[5]); |
va009039 | 0:db4242c89949 | 71 | size -= 8; |
va009039 | 0:db4242c89949 | 72 | if (size > len) { |
va009039 | 0:db4242c89949 | 73 | size = len; |
va009039 | 0:db4242c89949 | 74 | } |
va009039 | 0:db4242c89949 | 75 | W5100.recv_data_processing(_socket, (uint8_t*)buf, size); |
va009039 | 0:db4242c89949 | 76 | W5100.execCmdSn(_socket, Sock_RECV); |
va009039 | 0:db4242c89949 | 77 | #ifdef DEBUG |
va009039 | 0:db4242c89949 | 78 | printfBytes("UDP PACKET-INFO", (u8*)info, 8); |
va009039 | 0:db4242c89949 | 79 | printHex((u8*)buf, size); |
va009039 | 0:db4242c89949 | 80 | #endif //DEBUG |
va009039 | 0:db4242c89949 | 81 | return size; |
va009039 | 0:db4242c89949 | 82 | } |
va009039 | 0:db4242c89949 | 83 | |
va009039 | 0:db4242c89949 | 84 | UDPSocketErr close() |
va009039 | 0:db4242c89949 | 85 | { |
va009039 | 0:db4242c89949 | 86 | W5100.execCmdSn(_socket, Sock_CLOSE); |
va009039 | 0:db4242c89949 | 87 | return UDPSOCKET_OK; |
va009039 | 0:db4242c89949 | 88 | } |
va009039 | 0:db4242c89949 | 89 | |
va009039 | 0:db4242c89949 | 90 | void setOnEvent(void (*pMethod)(UDPSocketEvent)) |
va009039 | 0:db4242c89949 | 91 | { |
va009039 | 0:db4242c89949 | 92 | m_pCb = pMethod; |
va009039 | 0:db4242c89949 | 93 | } |
va009039 | 0:db4242c89949 | 94 | |
va009039 | 0:db4242c89949 | 95 | void resetOnEvent() { |
va009039 | 0:db4242c89949 | 96 | m_pCb = NULL; |
va009039 | 0:db4242c89949 | 97 | } |
va009039 | 0:db4242c89949 | 98 | |
va009039 | 0:db4242c89949 | 99 | void poll() |
va009039 | 0:db4242c89949 | 100 | { |
va009039 | 0:db4242c89949 | 101 | PRINT_FUNC(); |
va009039 | 0:db4242c89949 | 102 | #ifdef DEBUG |
va009039 | 0:db4242c89949 | 103 | printf("socket:%d SnMR:%02x SnIR:%02x SnSR:%02x\n", _socket, |
va009039 | 0:db4242c89949 | 104 | W5100.readSnMR(_socket), W5100.readSnIR(_socket), W5100.readSnSR(_socket)); |
va009039 | 0:db4242c89949 | 105 | uint8_t ip[4]; |
va009039 | 0:db4242c89949 | 106 | W5100.readSnDIPR(_socket, ip); |
va009039 | 0:db4242c89949 | 107 | printf("Sn_DIPR: %d.%d.%d.%d Sn_DPORT: %d\n", ip[0], ip[1], ip[2], ip[3], W5100.readSnDPORT(_socket)); |
va009039 | 0:db4242c89949 | 108 | uint8_t mac[6]; |
va009039 | 0:db4242c89949 | 109 | W5100.readSnDHAR(_socket, mac); |
va009039 | 0:db4242c89949 | 110 | printf("Sn_DHAR: %02x:%02x:%02x:%02x:%02x:%02x\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); |
va009039 | 0:db4242c89949 | 111 | printf("Sn_RX_RSR:%d, Sn_RX_RD:%d, Sn_RX_WR:%d\n", |
va009039 | 0:db4242c89949 | 112 | W5100.readSnRX_RSR(_socket), W5100.readSnRX_RD(_socket), W5100.readSnRX_WR(_socket)); |
va009039 | 0:db4242c89949 | 113 | printf("Sn_TX_FSR:%d, Sn_TX_RD:%d, Sn_TX_WR:%d\n", |
va009039 | 0:db4242c89949 | 114 | W5100.readSnTX_FSR(_socket), W5100.readSnTX_RD(_socket), W5100.readSnTX_WR(_socket)); |
va009039 | 0:db4242c89949 | 115 | #endif //DEBUG |
va009039 | 0:db4242c89949 | 116 | if (m_pCb == NULL) { |
va009039 | 0:db4242c89949 | 117 | return; |
va009039 | 0:db4242c89949 | 118 | } |
va009039 | 0:db4242c89949 | 119 | if (W5100.getRXReceivedSize(_socket) > 0) { |
va009039 | 0:db4242c89949 | 120 | m_pCb(UDPSOCKET_READABLE); |
va009039 | 0:db4242c89949 | 121 | return; |
va009039 | 0:db4242c89949 | 122 | } |
va009039 | 0:db4242c89949 | 123 | } |
va009039 | 0:db4242c89949 | 124 | }; |
va009039 | 0:db4242c89949 | 125 | #endif // MYUDPSOCKET_H |