Embedded WebSockets Experiment

Dependencies:   mbed MD5

Committer:
nandgate
Date:
Tue Jul 26 05:30:53 2011 +0000
Revision:
0:6dee052a3fa4

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nandgate 0:6dee052a3fa4 1 #include "lwip/opt.h"
nandgate 0:6dee052a3fa4 2 #include "lwip/stats.h"
nandgate 0:6dee052a3fa4 3 #include "lwip/sys.h"
nandgate 0:6dee052a3fa4 4 #include "lwip/pbuf.h"
nandgate 0:6dee052a3fa4 5 #include "lwip/udp.h"
nandgate 0:6dee052a3fa4 6 #include "lwip/tcp.h"
nandgate 0:6dee052a3fa4 7 #include "lwip/dns.h"
nandgate 0:6dee052a3fa4 8 #include "lwip/dhcp.h"
nandgate 0:6dee052a3fa4 9 #include "lwip/init.h"
nandgate 0:6dee052a3fa4 10 #include "lwip/netif.h"
nandgate 0:6dee052a3fa4 11 #include "netif/etharp.h"
nandgate 0:6dee052a3fa4 12 #include "netif/loopif.h"
nandgate 0:6dee052a3fa4 13 #include "device.h"
nandgate 0:6dee052a3fa4 14 #include "Ethernet.h"
nandgate 0:6dee052a3fa4 15
nandgate 0:6dee052a3fa4 16 #include "NetServer.h"
nandgate 0:6dee052a3fa4 17 #include "TCPListener.h"
nandgate 0:6dee052a3fa4 18 #include "TCPCallbackListener.h"
nandgate 0:6dee052a3fa4 19 #include "TCPConnection.h"
nandgate 0:6dee052a3fa4 20
nandgate 0:6dee052a3fa4 21 using namespace std;
nandgate 0:6dee052a3fa4 22 using namespace mbed;
nandgate 0:6dee052a3fa4 23
nandgate 0:6dee052a3fa4 24 NetServer *NetServer::singleton = NULL;
nandgate 0:6dee052a3fa4 25
nandgate 0:6dee052a3fa4 26 NetServer::NetServer() : netif(&netif_data), dhcp(true), hostname(HOSTNAME) {
nandgate 0:6dee052a3fa4 27 _time.start();
nandgate 0:6dee052a3fa4 28 IP4_ADDR(&netmask, 255,255,255,255);
nandgate 0:6dee052a3fa4 29 IP4_ADDR(&gateway, 0,0,0,0);
nandgate 0:6dee052a3fa4 30 IP4_ADDR(&ipaddr, 0,0,0,0);
nandgate 0:6dee052a3fa4 31 netif->hwaddr_len = 0;
nandgate 0:6dee052a3fa4 32 del = new list<TCPItem *>();
nandgate 0:6dee052a3fa4 33 }
nandgate 0:6dee052a3fa4 34
nandgate 0:6dee052a3fa4 35 NetServer::NetServer(struct ip_addr ip, struct ip_addr nm, struct ip_addr gw)
nandgate 0:6dee052a3fa4 36 : netif(&netif_data), ipaddr(ip), netmask(nm), gateway(gw), dhcp(false), hostname(HOSTNAME) {
nandgate 0:6dee052a3fa4 37 _time.start();
nandgate 0:6dee052a3fa4 38 netif->hwaddr_len = 0;
nandgate 0:6dee052a3fa4 39 del = new list<TCPItem *>();
nandgate 0:6dee052a3fa4 40 }
nandgate 0:6dee052a3fa4 41
nandgate 0:6dee052a3fa4 42 NetServer::~NetServer() {
nandgate 0:6dee052a3fa4 43
nandgate 0:6dee052a3fa4 44 }
nandgate 0:6dee052a3fa4 45
nandgate 0:6dee052a3fa4 46 void NetServer::_poll() const {
nandgate 0:6dee052a3fa4 47 while(!del->empty()) {
nandgate 0:6dee052a3fa4 48 TCPItem *item = del->front();
nandgate 0:6dee052a3fa4 49 del->pop_front();
nandgate 0:6dee052a3fa4 50 delete item;
nandgate 0:6dee052a3fa4 51 }
nandgate 0:6dee052a3fa4 52 device_poll();
nandgate 0:6dee052a3fa4 53 tcp_tmr();
nandgate 0:6dee052a3fa4 54 }
nandgate 0:6dee052a3fa4 55
nandgate 0:6dee052a3fa4 56 void NetServer::init() {
nandgate 0:6dee052a3fa4 57 lwip_init();
nandgate 0:6dee052a3fa4 58
nandgate 0:6dee052a3fa4 59 netif->hwaddr_len = ETHARP_HWADDR_LEN;
nandgate 0:6dee052a3fa4 60 device_address((char *)netif->hwaddr);
nandgate 0:6dee052a3fa4 61
nandgate 0:6dee052a3fa4 62 netif = netif_add(netif, &ipaddr, &netmask, &gateway, NULL, device_init, ip_input);
nandgate 0:6dee052a3fa4 63 netif->hostname = (char *)this->hostname;
nandgate 0:6dee052a3fa4 64 netif_set_default(netif);
nandgate 0:6dee052a3fa4 65 if(!dhcp) {
nandgate 0:6dee052a3fa4 66 netif_set_up(netif);
nandgate 0:6dee052a3fa4 67 } else {
nandgate 0:6dee052a3fa4 68 dhcp_start(netif);
nandgate 0:6dee052a3fa4 69 }
nandgate 0:6dee052a3fa4 70
nandgate 0:6dee052a3fa4 71 tickARP.attach_us( &etharp_tmr, ARP_TMR_INTERVAL * 1000);
nandgate 0:6dee052a3fa4 72 //eth_tick.attach_us<NetServer>(this,&emac_tmr, TCP_FAST_INTERVAL * 1000);
nandgate 0:6dee052a3fa4 73 dns_tick.attach_us(&dns_tmr, DNS_TMR_INTERVAL * 1000);
nandgate 0:6dee052a3fa4 74 if(dhcp) {
nandgate 0:6dee052a3fa4 75 dhcp_coarse.attach_us(&dhcp_coarse_tmr, DHCP_COARSE_TIMER_MSECS * 1000);
nandgate 0:6dee052a3fa4 76 dhcp_fine.attach_us(&dhcp_fine_tmr, DHCP_FINE_TIMER_MSECS * 1000);
nandgate 0:6dee052a3fa4 77 }
nandgate 0:6dee052a3fa4 78 }
nandgate 0:6dee052a3fa4 79
nandgate 0:6dee052a3fa4 80 void NetServer::setUp() const {
nandgate 0:6dee052a3fa4 81 netif_set_up(netif);
nandgate 0:6dee052a3fa4 82 }
nandgate 0:6dee052a3fa4 83
nandgate 0:6dee052a3fa4 84 void NetServer::setDown() const {
nandgate 0:6dee052a3fa4 85 netif_set_down(netif);
nandgate 0:6dee052a3fa4 86 }
nandgate 0:6dee052a3fa4 87
nandgate 0:6dee052a3fa4 88 int NetServer::isUp() const {
nandgate 0:6dee052a3fa4 89 return netif_is_up(netif);
nandgate 0:6dee052a3fa4 90 }
nandgate 0:6dee052a3fa4 91
nandgate 0:6dee052a3fa4 92 void NetServer::waitUntilReady() {
nandgate 0:6dee052a3fa4 93 while(!netif_is_up(netif)) {
nandgate 0:6dee052a3fa4 94 _poll();
nandgate 0:6dee052a3fa4 95 wait_ms(1);
nandgate 0:6dee052a3fa4 96 }
nandgate 0:6dee052a3fa4 97 ipaddr = netif->ip_addr;
nandgate 0:6dee052a3fa4 98 printf("IP: %hhu.%hhu.%hhu.%hhu\n", (ipaddr.addr)&0xFF, (ipaddr.addr>>8)&0xFF, (ipaddr.addr>>16)&0xFF, (ipaddr.addr>>24)&0xFF);
nandgate 0:6dee052a3fa4 99 }
nandgate 0:6dee052a3fa4 100
nandgate 0:6dee052a3fa4 101 TCPCallbackListener *NetServer::bindTCPPort(u16_t port, err_t (*accept)(TCPCallbackListener *, struct tcp_pcb *, err_t)) const {
nandgate 0:6dee052a3fa4 102 TCPCallbackListener *listener = new TCPCallbackListener(port, accept);
nandgate 0:6dee052a3fa4 103 listener->bind();
nandgate 0:6dee052a3fa4 104 return listener;
nandgate 0:6dee052a3fa4 105 }
nandgate 0:6dee052a3fa4 106
nandgate 0:6dee052a3fa4 107 void NetServer::free(TCPItem *item) const {
nandgate 0:6dee052a3fa4 108 del->push_back(item);
nandgate 0:6dee052a3fa4 109 }
nandgate 0:6dee052a3fa4 110
nandgate 0:6dee052a3fa4 111 int NetServer::time() {
nandgate 0:6dee052a3fa4 112 return NetServer::get()->_time.read_ms();
nandgate 0:6dee052a3fa4 113 }