DHCP Client for WIZ820io(W5200)

Dependencies:   EthernetNetIf mbed

Committer:
va009039
Date:
Tue Apr 10 03:38:22 2012 +0000
Revision:
0:db4242c89949

        

Who changed what in which revision?

UserRevisionLine numberNew 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