interwebs test program

Dependencies:   mbed lwip

Committer:
logictom
Date:
Sat Aug 20 18:21:21 2011 +0000
Revision:
0:802d313f3a83

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
logictom 0:802d313f3a83 1 #include "mbed.h"
logictom 0:802d313f3a83 2 #include "lwip/opt.h"
logictom 0:802d313f3a83 3 #include "lwip/stats.h"
logictom 0:802d313f3a83 4 #include "lwip/sys.h"
logictom 0:802d313f3a83 5 #include "lwip/pbuf.h"
logictom 0:802d313f3a83 6 #include "lwip/udp.h"
logictom 0:802d313f3a83 7 #include "lwip/tcp.h"
logictom 0:802d313f3a83 8 #include "lwip/dns.h"
logictom 0:802d313f3a83 9 #include "lwip/dhcp.h"
logictom 0:802d313f3a83 10 #include "lwip/init.h"
logictom 0:802d313f3a83 11 #include "lwip/netif.h"
logictom 0:802d313f3a83 12 #include "netif/etharp.h"
logictom 0:802d313f3a83 13 #include "netif/loopif.h"
logictom 0:802d313f3a83 14 #include "device.h"
logictom 0:802d313f3a83 15
logictom 0:802d313f3a83 16 Ethernet ethernet;
logictom 0:802d313f3a83 17 DigitalOut ledLink(p30);
logictom 0:802d313f3a83 18 DigitalOut ledActivity(p29);
logictom 0:802d313f3a83 19 DigitalOut ledStage0 (LED1);
logictom 0:802d313f3a83 20 DigitalOut ledStage1 (LED2);
logictom 0:802d313f3a83 21 DigitalOut ledStage2 (LED3);
logictom 0:802d313f3a83 22 DigitalOut ledTCP80 (LED4);
logictom 0:802d313f3a83 23
logictom 0:802d313f3a83 24 volatile char stage = 0;
logictom 0:802d313f3a83 25
logictom 0:802d313f3a83 26 Ticker stage_blinker;
logictom 0:802d313f3a83 27
logictom 0:802d313f3a83 28 struct netif netif_data;
logictom 0:802d313f3a83 29
logictom 0:802d313f3a83 30 const char testPage[] = "HTTP/1.1 200 OK\r\n"
logictom 0:802d313f3a83 31 "Content-Type: text/html\r\n"
logictom 0:802d313f3a83 32 "Connection: Close\r\n\r\n"
logictom 0:802d313f3a83 33 "<html>"
logictom 0:802d313f3a83 34 "<head>"
logictom 0:802d313f3a83 35 "<title>mbed test page</title>"
logictom 0:802d313f3a83 36 "<style type='text/css'>"
logictom 0:802d313f3a83 37 "body{font-family:'Arial, sans-serif', sans-serif;font-size:.8em;background-color:#fff;}"
logictom 0:802d313f3a83 38 "</style>"
logictom 0:802d313f3a83 39 "</head>"
logictom 0:802d313f3a83 40 "<body>%s</body></html>\r\n\r\n";
logictom 0:802d313f3a83 41
logictom 0:802d313f3a83 42 char buffer[1024];
logictom 0:802d313f3a83 43 char temp[1024];
logictom 0:802d313f3a83 44 err_t recv_callback(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) {
logictom 0:802d313f3a83 45 struct netif *netif = &netif_data;
logictom 0:802d313f3a83 46 ledTCP80 = true;
logictom 0:802d313f3a83 47 printf("TCP callback from %d.%d.%d.%d\r\n", ip4_addr1(&(pcb->remote_ip)),ip4_addr2(&(pcb->remote_ip)),ip4_addr3(&(pcb->remote_ip)),ip4_addr4(&(pcb->remote_ip)));
logictom 0:802d313f3a83 48 char *data;
logictom 0:802d313f3a83 49 /* Check if status is ok and data is arrived. */
logictom 0:802d313f3a83 50 if (err == ERR_OK && p != NULL) {
logictom 0:802d313f3a83 51 /* Inform TCP that we have taken the data. */
logictom 0:802d313f3a83 52 tcp_recved(pcb, p->tot_len);
logictom 0:802d313f3a83 53 data = static_cast<char *>(p->payload);
logictom 0:802d313f3a83 54 /* If the data is a GET request we can handle it. */
logictom 0:802d313f3a83 55 if (strncmp(data, "GET ", 4) == 0) {
logictom 0:802d313f3a83 56 printf("Handling GET request...\r\n");
logictom 0:802d313f3a83 57 printf("Request:\r\n%s\r\n", data);
logictom 0:802d313f3a83 58
logictom 0:802d313f3a83 59 //generate the test page
logictom 0:802d313f3a83 60 time_t seconds = time(NULL);
logictom 0:802d313f3a83 61 sprintf(temp, "<h1>Congratulations!</h1>If you can see this page, your mbed is working properly."
logictom 0:802d313f3a83 62 "<h2>mbed Configuration</h2>"
logictom 0:802d313f3a83 63 "mbed RTC time:%s<br/>"
logictom 0:802d313f3a83 64 "mbed HW address: %02x:%02x:%02x:%02x:%02x:%02x<br/>"
logictom 0:802d313f3a83 65 "mbed IP Address: %s<br/>",
logictom 0:802d313f3a83 66 ctime(&seconds),
logictom 0:802d313f3a83 67 (char*) netif->hwaddr[0],
logictom 0:802d313f3a83 68 (char*) netif->hwaddr[1],
logictom 0:802d313f3a83 69 (char*) netif->hwaddr[2],
logictom 0:802d313f3a83 70 (char*) netif->hwaddr[3],
logictom 0:802d313f3a83 71 (char*) netif->hwaddr[4],
logictom 0:802d313f3a83 72 (char*) netif->hwaddr[5],
logictom 0:802d313f3a83 73 inet_ntoa(*(struct in_addr*)&(netif->ip_addr))
logictom 0:802d313f3a83 74 );
logictom 0:802d313f3a83 75 sprintf(buffer, testPage, temp);
logictom 0:802d313f3a83 76 if (tcp_write(pcb, (void *)buffer, strlen(buffer), 1) == ERR_OK) {
logictom 0:802d313f3a83 77 tcp_output(pcb);
logictom 0:802d313f3a83 78 printf("Closing connection...\r\n");
logictom 0:802d313f3a83 79 tcp_close(pcb);
logictom 0:802d313f3a83 80 }
logictom 0:802d313f3a83 81 }
logictom 0:802d313f3a83 82 else
logictom 0:802d313f3a83 83 {
logictom 0:802d313f3a83 84 printf("Non GET request...\r\nRequest:\r\n%s\r\n", data);
logictom 0:802d313f3a83 85 }
logictom 0:802d313f3a83 86
logictom 0:802d313f3a83 87 pbuf_free(p);
logictom 0:802d313f3a83 88 }
logictom 0:802d313f3a83 89
logictom 0:802d313f3a83 90 else {
logictom 0:802d313f3a83 91 /* No data arrived */
logictom 0:802d313f3a83 92 /* That means the client closes the connection and sent us a packet with FIN flag set to 1. */
logictom 0:802d313f3a83 93 /* We have to cleanup and destroy out TCPConnection. */
logictom 0:802d313f3a83 94 printf("Connection closed by client.\r\n");
logictom 0:802d313f3a83 95 pbuf_free(p);
logictom 0:802d313f3a83 96 }
logictom 0:802d313f3a83 97 /* Don't panic! Everything is fine. */
logictom 0:802d313f3a83 98 ledTCP80 = false;
logictom 0:802d313f3a83 99 return ERR_OK;
logictom 0:802d313f3a83 100 }
logictom 0:802d313f3a83 101 /* Accept an incomming call on the registered port */
logictom 0:802d313f3a83 102 err_t accept_callback(void *arg, struct tcp_pcb *npcb, err_t err) {
logictom 0:802d313f3a83 103 LWIP_UNUSED_ARG(arg);
logictom 0:802d313f3a83 104 /* Subscribe a receive callback function */
logictom 0:802d313f3a83 105 tcp_recv(npcb, &recv_callback);
logictom 0:802d313f3a83 106 /* Don't panic! Everything is fine. */
logictom 0:802d313f3a83 107 return ERR_OK;
logictom 0:802d313f3a83 108 }
logictom 0:802d313f3a83 109
logictom 0:802d313f3a83 110 void stageblinker()
logictom 0:802d313f3a83 111 {
logictom 0:802d313f3a83 112 switch (stage)
logictom 0:802d313f3a83 113 {
logictom 0:802d313f3a83 114 case 0:
logictom 0:802d313f3a83 115 ledStage0 = !ledStage0;
logictom 0:802d313f3a83 116 ledStage1 = false;
logictom 0:802d313f3a83 117 ledStage2 = false;
logictom 0:802d313f3a83 118 break;
logictom 0:802d313f3a83 119 case 1:
logictom 0:802d313f3a83 120 ledStage0 = true;
logictom 0:802d313f3a83 121 ledStage1 = !ledStage1;
logictom 0:802d313f3a83 122 ledStage2 = false;
logictom 0:802d313f3a83 123 break;
logictom 0:802d313f3a83 124 case 2:
logictom 0:802d313f3a83 125 ledStage0 = true;
logictom 0:802d313f3a83 126 ledStage1 = true;
logictom 0:802d313f3a83 127 ledStage2 = true;
logictom 0:802d313f3a83 128 stage_blinker.detach();
logictom 0:802d313f3a83 129 break;
logictom 0:802d313f3a83 130 }
logictom 0:802d313f3a83 131 }
logictom 0:802d313f3a83 132
logictom 0:802d313f3a83 133 int main() {
logictom 0:802d313f3a83 134 printf("mBed Ethernet Tester 1.0\r\nStarting Up...\r\n");
logictom 0:802d313f3a83 135 stage = 0;
logictom 0:802d313f3a83 136 struct netif *netif = &netif_data;
logictom 0:802d313f3a83 137 struct ip_addr ipaddr;
logictom 0:802d313f3a83 138 struct ip_addr netmask;
logictom 0:802d313f3a83 139 struct ip_addr gateway;
logictom 0:802d313f3a83 140 Ticker tickFast, tickSlow, tickARP, eth_tick, dns_tick, dhcp_coarse, dhcp_fine;
logictom 0:802d313f3a83 141 stage_blinker.attach_us(&stageblinker, 1000*500);
logictom 0:802d313f3a83 142
logictom 0:802d313f3a83 143 char *hostname = "my-mbed";
logictom 0:802d313f3a83 144
logictom 0:802d313f3a83 145 printf("Configuring device for DHCP...\r\n");
logictom 0:802d313f3a83 146 /* Start Network with DHCP */
logictom 0:802d313f3a83 147 IP4_ADDR(&netmask, 255,255,255,255);
logictom 0:802d313f3a83 148 IP4_ADDR(&gateway, 0,0,0,0);
logictom 0:802d313f3a83 149 IP4_ADDR(&ipaddr, 0,0,0,0);
logictom 0:802d313f3a83 150 /* Initialise after configuration */
logictom 0:802d313f3a83 151 lwip_init();
logictom 0:802d313f3a83 152 netif->hwaddr_len = ETHARP_HWADDR_LEN;
logictom 0:802d313f3a83 153 device_address((char *)netif->hwaddr);
logictom 0:802d313f3a83 154 netif = netif_add(netif, &ipaddr, &netmask, &gateway, NULL, device_init, ip_input);
logictom 0:802d313f3a83 155 netif->hostname = hostname;
logictom 0:802d313f3a83 156 netif_set_default(netif);
logictom 0:802d313f3a83 157 dhcp_start(netif); // <-- Use DHCP
logictom 0:802d313f3a83 158
logictom 0:802d313f3a83 159 /* Initialise all needed timers */
logictom 0:802d313f3a83 160 tickARP.attach_us( &etharp_tmr, ARP_TMR_INTERVAL * 1000);
logictom 0:802d313f3a83 161 tickFast.attach_us(&tcp_fasttmr, TCP_FAST_INTERVAL * 1000);
logictom 0:802d313f3a83 162 tickSlow.attach_us(&tcp_slowtmr, TCP_SLOW_INTERVAL * 1000);
logictom 0:802d313f3a83 163 dns_tick.attach_us(&dns_tmr, DNS_TMR_INTERVAL * 1000);
logictom 0:802d313f3a83 164 dhcp_coarse.attach_us(&dhcp_coarse_tmr, DHCP_COARSE_TIMER_MSECS * 1000);
logictom 0:802d313f3a83 165 dhcp_fine.attach_us(&dhcp_fine_tmr, DHCP_FINE_TIMER_MSECS * 1000);
logictom 0:802d313f3a83 166 stage = 1;
logictom 0:802d313f3a83 167 while (!netif_is_up(netif)) {
logictom 0:802d313f3a83 168 ledLink = ethernet.link();
logictom 0:802d313f3a83 169 device_poll();
logictom 0:802d313f3a83 170 }
logictom 0:802d313f3a83 171
logictom 0:802d313f3a83 172 /*
logictom 0:802d313f3a83 173 while (!(netif->dhcp->state == DHCP_BOUND || netif->dhcp->state == DHCP_PERMANENT))
logictom 0:802d313f3a83 174 {
logictom 0:802d313f3a83 175 ledLink = ethernet.link();
logictom 0:802d313f3a83 176 device_poll();
logictom 0:802d313f3a83 177 //printf("Waiting for DHCP response, state = %d\r\n", netif->dhcp->state);
logictom 0:802d313f3a83 178 //wait_ms(100);
logictom 0:802d313f3a83 179 }
logictom 0:802d313f3a83 180 */
logictom 0:802d313f3a83 181 stage = 2;
logictom 0:802d313f3a83 182 printf("Interface is up, local IP is %s\r\n",
logictom 0:802d313f3a83 183 inet_ntoa(*(struct in_addr*)&(netif->ip_addr)));
logictom 0:802d313f3a83 184
logictom 0:802d313f3a83 185 printf("Starting Web Server...\r\n");
logictom 0:802d313f3a83 186
logictom 0:802d313f3a83 187 /* Bind a function to a tcp port */
logictom 0:802d313f3a83 188 struct tcp_pcb *pcb = tcp_new();
logictom 0:802d313f3a83 189 if (tcp_bind(pcb, IP_ADDR_ANY, 80) == ERR_OK) {
logictom 0:802d313f3a83 190 pcb = tcp_listen(pcb);
logictom 0:802d313f3a83 191 tcp_accept(pcb, &accept_callback);
logictom 0:802d313f3a83 192 }
logictom 0:802d313f3a83 193
logictom 0:802d313f3a83 194 printf("Waiting for connection...\r\n");
logictom 0:802d313f3a83 195 while(1) {
logictom 0:802d313f3a83 196 device_poll();
logictom 0:802d313f3a83 197 ledLink = ethernet.link();
logictom 0:802d313f3a83 198 }
logictom 0:802d313f3a83 199 }