Peter Cooper
/
diags
test code for our MBED board
network.c@1:6877bb99aa17, 2011-05-04 (annotated)
- Committer:
- lolpcc
- Date:
- Wed May 04 08:30:52 2011 +0000
- Revision:
- 1:6877bb99aa17
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
lolpcc | 1:6877bb99aa17 | 1 | //#include "TCPCallbackConnection.h" |
lolpcc | 1:6877bb99aa17 | 2 | //#include "NetServer.h" |
lolpcc | 1:6877bb99aa17 | 3 | #include "mbed.h" |
lolpcc | 1:6877bb99aa17 | 4 | #include "led.h" |
lolpcc | 1:6877bb99aa17 | 5 | #include "can.h" |
lolpcc | 1:6877bb99aa17 | 6 | #include "cmd.h" |
lolpcc | 1:6877bb99aa17 | 7 | #include "help_data.h" |
lolpcc | 1:6877bb99aa17 | 8 | #include "SNTPClient.h" |
lolpcc | 1:6877bb99aa17 | 9 | #include "breakup.h" |
lolpcc | 1:6877bb99aa17 | 10 | #include "ticker.h" |
lolpcc | 1:6877bb99aa17 | 11 | #include "useful.h" |
lolpcc | 1:6877bb99aa17 | 12 | |
lolpcc | 1:6877bb99aa17 | 13 | #include "lwip/opt.h" |
lolpcc | 1:6877bb99aa17 | 14 | #include "lwip/stats.h" |
lolpcc | 1:6877bb99aa17 | 15 | #include "lwip/sys.h" |
lolpcc | 1:6877bb99aa17 | 16 | #include "lwip/pbuf.h" |
lolpcc | 1:6877bb99aa17 | 17 | #include "lwip/udp.h" |
lolpcc | 1:6877bb99aa17 | 18 | #include "lwip/tcp.h" |
lolpcc | 1:6877bb99aa17 | 19 | #include "lwip/dns.h" |
lolpcc | 1:6877bb99aa17 | 20 | #include "lwip/dhcp.h" |
lolpcc | 1:6877bb99aa17 | 21 | #include "lwip/init.h" |
lolpcc | 1:6877bb99aa17 | 22 | #include "lwip/netif.h" |
lolpcc | 1:6877bb99aa17 | 23 | #include "netif/etharp.h" |
lolpcc | 1:6877bb99aa17 | 24 | #include "netif/loopif.h" |
lolpcc | 1:6877bb99aa17 | 25 | #include "device.h" |
lolpcc | 1:6877bb99aa17 | 26 | |
lolpcc | 1:6877bb99aa17 | 27 | Ethernet ethernet; |
lolpcc | 1:6877bb99aa17 | 28 | extern int net_state; |
lolpcc | 1:6877bb99aa17 | 29 | extern char station_id; |
lolpcc | 1:6877bb99aa17 | 30 | volatile char stage = 0; |
lolpcc | 1:6877bb99aa17 | 31 | |
lolpcc | 1:6877bb99aa17 | 32 | struct netif netif_data; |
lolpcc | 1:6877bb99aa17 | 33 | |
lolpcc | 1:6877bb99aa17 | 34 | char *header = "HTTP/1.1 200 OK\r\n" |
lolpcc | 1:6877bb99aa17 | 35 | "Content-Type: text/html\r\n" |
lolpcc | 1:6877bb99aa17 | 36 | "Connection: Close\r\n\r\n" |
lolpcc | 1:6877bb99aa17 | 37 | "<html>\r\n" |
lolpcc | 1:6877bb99aa17 | 38 | "<head>\r\n" |
lolpcc | 1:6877bb99aa17 | 39 | "<title>%s</title>\r\n" |
lolpcc | 1:6877bb99aa17 | 40 | "<style type='text/css'>\r\n" |
lolpcc | 1:6877bb99aa17 | 41 | "body{font-family:'Arial, sans-serif', sans-serif;font-size:.8em;background-color:#fff;}\r\n" |
lolpcc | 1:6877bb99aa17 | 42 | "</style>\r\n" |
lolpcc | 1:6877bb99aa17 | 43 | "</head>\r\n"; |
lolpcc | 1:6877bb99aa17 | 44 | |
lolpcc | 1:6877bb99aa17 | 45 | char network_write_packet(struct tcp_pcb *pcb, char *buf) |
lolpcc | 1:6877bb99aa17 | 46 | { |
lolpcc | 1:6877bb99aa17 | 47 | if (tcp_write(pcb, (void *)buf, strlen(buf), 1) == ERR_OK) { |
lolpcc | 1:6877bb99aa17 | 48 | tcp_output(pcb); |
lolpcc | 1:6877bb99aa17 | 49 | lprintf("Wrote packet String (Size %d bytes)OK...\n",strlen(buf)); |
lolpcc | 1:6877bb99aa17 | 50 | return(1); |
lolpcc | 1:6877bb99aa17 | 51 | } else { |
lolpcc | 1:6877bb99aa17 | 52 | lprintf("Transission Problem (Size %d bytes), Closing connection...\n",strlen(buf)); |
lolpcc | 1:6877bb99aa17 | 53 | tcp_close(pcb); |
lolpcc | 1:6877bb99aa17 | 54 | return(0); |
lolpcc | 1:6877bb99aa17 | 55 | } |
lolpcc | 1:6877bb99aa17 | 56 | } |
lolpcc | 1:6877bb99aa17 | 57 | void network_send_page(struct tcp_pcb *pcb,char *head, char *body, char *tail) |
lolpcc | 1:6877bb99aa17 | 58 | { |
lolpcc | 1:6877bb99aa17 | 59 | if(network_write_packet(pcb, head)){ |
lolpcc | 1:6877bb99aa17 | 60 | if(network_write_packet(pcb, body)){ |
lolpcc | 1:6877bb99aa17 | 61 | if(network_write_packet(pcb, tail)){ |
lolpcc | 1:6877bb99aa17 | 62 | tcp_close(pcb); |
lolpcc | 1:6877bb99aa17 | 63 | } else { |
lolpcc | 1:6877bb99aa17 | 64 | tcp_close(pcb); |
lolpcc | 1:6877bb99aa17 | 65 | } |
lolpcc | 1:6877bb99aa17 | 66 | } else { |
lolpcc | 1:6877bb99aa17 | 67 | tcp_close(pcb); |
lolpcc | 1:6877bb99aa17 | 68 | } |
lolpcc | 1:6877bb99aa17 | 69 | } else { |
lolpcc | 1:6877bb99aa17 | 70 | tcp_close(pcb); |
lolpcc | 1:6877bb99aa17 | 71 | } |
lolpcc | 1:6877bb99aa17 | 72 | } |
lolpcc | 1:6877bb99aa17 | 73 | int network_text_packet(struct tcp_pcb *pcb, char *buf) |
lolpcc | 1:6877bb99aa17 | 74 | { |
lolpcc | 1:6877bb99aa17 | 75 | char str[0x1200]; /* So we can take a 1024 byte string max */ |
lolpcc | 1:6877bb99aa17 | 76 | char c; |
lolpcc | 1:6877bb99aa17 | 77 | int a = 0; /* Input pointer */ |
lolpcc | 1:6877bb99aa17 | 78 | int b = 0; /* output pointer */ |
lolpcc | 1:6877bb99aa17 | 79 | |
lolpcc | 1:6877bb99aa17 | 80 | str[b]='<'; |
lolpcc | 1:6877bb99aa17 | 81 | b++; |
lolpcc | 1:6877bb99aa17 | 82 | str[b]='p'; |
lolpcc | 1:6877bb99aa17 | 83 | b++; |
lolpcc | 1:6877bb99aa17 | 84 | str[b]='r'; |
lolpcc | 1:6877bb99aa17 | 85 | b++; |
lolpcc | 1:6877bb99aa17 | 86 | str[b]='e'; |
lolpcc | 1:6877bb99aa17 | 87 | b++; |
lolpcc | 1:6877bb99aa17 | 88 | str[b]='>'; |
lolpcc | 1:6877bb99aa17 | 89 | b++; |
lolpcc | 1:6877bb99aa17 | 90 | |
lolpcc | 1:6877bb99aa17 | 91 | while(a != strlen(buf)){ |
lolpcc | 1:6877bb99aa17 | 92 | c = buf[a]; |
lolpcc | 1:6877bb99aa17 | 93 | if(c=='\n'){ |
lolpcc | 1:6877bb99aa17 | 94 | str[b]='<'; |
lolpcc | 1:6877bb99aa17 | 95 | b++; |
lolpcc | 1:6877bb99aa17 | 96 | str[b]='b'; |
lolpcc | 1:6877bb99aa17 | 97 | b++; |
lolpcc | 1:6877bb99aa17 | 98 | str[b]='r'; |
lolpcc | 1:6877bb99aa17 | 99 | b++; |
lolpcc | 1:6877bb99aa17 | 100 | str[b]='>'; |
lolpcc | 1:6877bb99aa17 | 101 | b++; |
lolpcc | 1:6877bb99aa17 | 102 | str[b]='\n'; |
lolpcc | 1:6877bb99aa17 | 103 | b++; |
lolpcc | 1:6877bb99aa17 | 104 | a++; |
lolpcc | 1:6877bb99aa17 | 105 | } else if(c=='<') { |
lolpcc | 1:6877bb99aa17 | 106 | a++; |
lolpcc | 1:6877bb99aa17 | 107 | } else if(c=='>') { |
lolpcc | 1:6877bb99aa17 | 108 | a++; |
lolpcc | 1:6877bb99aa17 | 109 | } else { |
lolpcc | 1:6877bb99aa17 | 110 | str[b] = c; |
lolpcc | 1:6877bb99aa17 | 111 | a++; |
lolpcc | 1:6877bb99aa17 | 112 | b++; |
lolpcc | 1:6877bb99aa17 | 113 | } |
lolpcc | 1:6877bb99aa17 | 114 | } |
lolpcc | 1:6877bb99aa17 | 115 | str[b]='<'; |
lolpcc | 1:6877bb99aa17 | 116 | b++; |
lolpcc | 1:6877bb99aa17 | 117 | str[b]='/'; |
lolpcc | 1:6877bb99aa17 | 118 | b++; |
lolpcc | 1:6877bb99aa17 | 119 | str[b]='p'; |
lolpcc | 1:6877bb99aa17 | 120 | b++; |
lolpcc | 1:6877bb99aa17 | 121 | str[b]='r'; |
lolpcc | 1:6877bb99aa17 | 122 | b++; |
lolpcc | 1:6877bb99aa17 | 123 | str[b]='e'; |
lolpcc | 1:6877bb99aa17 | 124 | b++; |
lolpcc | 1:6877bb99aa17 | 125 | str[b]='>'; |
lolpcc | 1:6877bb99aa17 | 126 | b++; |
lolpcc | 1:6877bb99aa17 | 127 | str[b]='\0'; |
lolpcc | 1:6877bb99aa17 | 128 | if(!network_write_packet(pcb, str)){ |
lolpcc | 1:6877bb99aa17 | 129 | lprintf("Problem Packet is:\n%s",str); |
lolpcc | 1:6877bb99aa17 | 130 | tcp_close(pcb); |
lolpcc | 1:6877bb99aa17 | 131 | return(1); |
lolpcc | 1:6877bb99aa17 | 132 | } |
lolpcc | 1:6877bb99aa17 | 133 | return(0); |
lolpcc | 1:6877bb99aa17 | 134 | } |
lolpcc | 1:6877bb99aa17 | 135 | err_t recv_callback(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) |
lolpcc | 1:6877bb99aa17 | 136 | { |
lolpcc | 1:6877bb99aa17 | 137 | struct netif *netif = &netif_data; |
lolpcc | 1:6877bb99aa17 | 138 | char *p1[100]; /* Used for the broke apart GET request */ |
lolpcc | 1:6877bb99aa17 | 139 | char *p2[3]; /* Diagnostics call */ |
lolpcc | 1:6877bb99aa17 | 140 | char *p3[10]; /* Diagnostics data */ |
lolpcc | 1:6877bb99aa17 | 141 | char head[1024],body[1024],tail[200]; |
lolpcc | 1:6877bb99aa17 | 142 | int ret; |
lolpcc | 1:6877bb99aa17 | 143 | |
lolpcc | 1:6877bb99aa17 | 144 | lprintf("TCP callback from %d.%d.%d.%d\n", ip4_addr1(&(pcb->remote_ip)),ip4_addr2(&(pcb->remote_ip)),ip4_addr3(&(pcb->remote_ip)),ip4_addr4(&(pcb->remote_ip))); |
lolpcc | 1:6877bb99aa17 | 145 | char *data; |
lolpcc | 1:6877bb99aa17 | 146 | /* Check if status is ok and data is arrived. */ |
lolpcc | 1:6877bb99aa17 | 147 | if (err == ERR_OK && p != NULL) { |
lolpcc | 1:6877bb99aa17 | 148 | /* Inform TCP that we have taken the data. */ |
lolpcc | 1:6877bb99aa17 | 149 | tcp_recved(pcb, p->tot_len); |
lolpcc | 1:6877bb99aa17 | 150 | data = static_cast<char *>(p->payload); |
lolpcc | 1:6877bb99aa17 | 151 | /* If the data is a GET request we can handle it. */ |
lolpcc | 1:6877bb99aa17 | 152 | if (strncmp(data, "GET ", 4) == 0) { |
lolpcc | 1:6877bb99aa17 | 153 | lprintf("Handling GET request...\r\n"); |
lolpcc | 1:6877bb99aa17 | 154 | lprintf("Request:\r\n%s\r\n", data); |
lolpcc | 1:6877bb99aa17 | 155 | breakup(data,p1,'/'); |
lolpcc | 1:6877bb99aa17 | 156 | time_t seconds = time(NULL); |
lolpcc | 1:6877bb99aa17 | 157 | sprintf(tail,"<br><small><A href=\"mailto:pcc@cs.york.ac.uk\">" |
lolpcc | 1:6877bb99aa17 | 158 | "pcc@cs.york.ac.uk</a>\n\r</small>\n\r" |
lolpcc | 1:6877bb99aa17 | 159 | "<small>mbed RTC time:%s</small><br/>\n\r" |
lolpcc | 1:6877bb99aa17 | 160 | "<a href=0>Home</a><br><br>\n\r" |
lolpcc | 1:6877bb99aa17 | 161 | "</body>\n\r</html>\n\r",ctime(&seconds)); |
lolpcc | 1:6877bb99aa17 | 162 | switch(p1[2][0]){ |
lolpcc | 1:6877bb99aa17 | 163 | case '0' : /* Home Page */ |
lolpcc | 1:6877bb99aa17 | 164 | sprintf(head,header,"MBED Home"); |
lolpcc | 1:6877bb99aa17 | 165 | sprintf(body,"<h1>Petes MBED Homepage</h1>\n\r" |
lolpcc | 1:6877bb99aa17 | 166 | "<a href=1>Board Type</a><br>\n\r" |
lolpcc | 1:6877bb99aa17 | 167 | "<a href=2>Networking</a><br>\n\r" |
lolpcc | 1:6877bb99aa17 | 168 | "<a href=3>Commands</a><br>\n\r" |
lolpcc | 1:6877bb99aa17 | 169 | "<a href=4>CAN Bus</a><br>\n\r" |
lolpcc | 1:6877bb99aa17 | 170 | "<a href=5>Diags</a><br>\n\r"); |
lolpcc | 1:6877bb99aa17 | 171 | network_send_page(pcb,head,body,tail); |
lolpcc | 1:6877bb99aa17 | 172 | break; |
lolpcc | 1:6877bb99aa17 | 173 | case '1' : /* Do something for page 1 */ |
lolpcc | 1:6877bb99aa17 | 174 | sprintf(head,header,"Board Type"); |
lolpcc | 1:6877bb99aa17 | 175 | sprintf(body,"<h1>MBED Board Data</h1>\n\r" |
lolpcc | 1:6877bb99aa17 | 176 | "Philips NXP <a href=http://mbed.org/nxp/lpc1768/>LPC1768</a>" |
lolpcc | 1:6877bb99aa17 | 177 | " Micro Controler <br>\n\r" |
lolpcc | 1:6877bb99aa17 | 178 | "512K Flash Memory, 64K SRAM<br>\n\r" |
lolpcc | 1:6877bb99aa17 | 179 | "<h4>MCP Solution gives:-</h4>\n\r" |
lolpcc | 1:6877bb99aa17 | 180 | "1 * RS232 channel, 1 * CAN bus channel<br>\n\r" |
lolpcc | 1:6877bb99aa17 | 181 | "Audio in and out, plus 4 analog inputs<br>\n\r" |
lolpcc | 1:6877bb99aa17 | 182 | "Micro SD card slot, USB + TCPIP networking<br>\n\r" |
lolpcc | 1:6877bb99aa17 | 183 | "+ I2C bus and selected I/O<br><br>\n\r" |
lolpcc | 1:6877bb99aa17 | 184 | "See mbed.org for data<br>\n\r"); |
lolpcc | 1:6877bb99aa17 | 185 | network_send_page(pcb,head,body,tail); |
lolpcc | 1:6877bb99aa17 | 186 | break; |
lolpcc | 1:6877bb99aa17 | 187 | case '2' : /* Networking */ |
lolpcc | 1:6877bb99aa17 | 188 | sprintf(head,header,"Network"); |
lolpcc | 1:6877bb99aa17 | 189 | sprintf(body, "<h1>MBED Networking</h1>\n\r" |
lolpcc | 1:6877bb99aa17 | 190 | "<h2>mbed Network Configuration</h2>\n\r" |
lolpcc | 1:6877bb99aa17 | 191 | "mbed HW address: %02x:%02x:%02x:%02x:%02x:%02x<br/>\n\r" |
lolpcc | 1:6877bb99aa17 | 192 | "mbed IP Address: %s<br/>\n\r" |
lolpcc | 1:6877bb99aa17 | 193 | "Station: %d<br>", |
lolpcc | 1:6877bb99aa17 | 194 | (char*) netif->hwaddr[0], |
lolpcc | 1:6877bb99aa17 | 195 | (char*) netif->hwaddr[1], |
lolpcc | 1:6877bb99aa17 | 196 | (char*) netif->hwaddr[2], |
lolpcc | 1:6877bb99aa17 | 197 | (char*) netif->hwaddr[3], |
lolpcc | 1:6877bb99aa17 | 198 | (char*) netif->hwaddr[4], |
lolpcc | 1:6877bb99aa17 | 199 | (char*) netif->hwaddr[5], |
lolpcc | 1:6877bb99aa17 | 200 | inet_ntoa(*(struct in_addr*)&(netif->ip_addr)), |
lolpcc | 1:6877bb99aa17 | 201 | station_id |
lolpcc | 1:6877bb99aa17 | 202 | ); |
lolpcc | 1:6877bb99aa17 | 203 | network_send_page(pcb,head,body,tail); |
lolpcc | 1:6877bb99aa17 | 204 | break; |
lolpcc | 1:6877bb99aa17 | 205 | case '3' : /* Do something for page 3 */ |
lolpcc | 1:6877bb99aa17 | 206 | sprintf(head,header,"Commands"); |
lolpcc | 1:6877bb99aa17 | 207 | network_write_packet(pcb,head); |
lolpcc | 1:6877bb99aa17 | 208 | sprintf(body,"<h1>MBED Commands</h1>\n\r"); |
lolpcc | 1:6877bb99aa17 | 209 | network_write_packet(pcb,body); |
lolpcc | 1:6877bb99aa17 | 210 | network_text_packet(pcb,HELP_STRING); |
lolpcc | 1:6877bb99aa17 | 211 | network_text_packet(pcb,HELP_STRING2); |
lolpcc | 1:6877bb99aa17 | 212 | network_text_packet(pcb,HELP_STRING3); |
lolpcc | 1:6877bb99aa17 | 213 | network_write_packet(pcb,tail); |
lolpcc | 1:6877bb99aa17 | 214 | tcp_close(pcb); |
lolpcc | 1:6877bb99aa17 | 215 | break; |
lolpcc | 1:6877bb99aa17 | 216 | case '4' : /* Do something for page 4 */ |
lolpcc | 1:6877bb99aa17 | 217 | sprintf(head,header,"CAN Bus<br>"); |
lolpcc | 1:6877bb99aa17 | 218 | network_send_page(pcb,head,body,tail); |
lolpcc | 1:6877bb99aa17 | 219 | break; |
lolpcc | 1:6877bb99aa17 | 220 | case '5' : /* Diagnostics page */ |
lolpcc | 1:6877bb99aa17 | 221 | sprintf(head,header,"Board Diags"); |
lolpcc | 1:6877bb99aa17 | 222 | network_write_packet(pcb,head); |
lolpcc | 1:6877bb99aa17 | 223 | /* Command handler */ |
lolpcc | 1:6877bb99aa17 | 224 | if(breakup(p1[2],p2,'?')>1){ |
lolpcc | 1:6877bb99aa17 | 225 | ret = breakup(p2[1],p3,'&'); |
lolpcc | 1:6877bb99aa17 | 226 | if((strcmp(p3[0],"ticker"))==0) |
lolpcc | 1:6877bb99aa17 | 227 | setup_ticker(); |
lolpcc | 1:6877bb99aa17 | 228 | else if((strcmp(p3[0],"lcd"))==0) |
lolpcc | 1:6877bb99aa17 | 229 | lcd_test(ret,p3); |
lolpcc | 1:6877bb99aa17 | 230 | else |
lolpcc | 1:6877bb99aa17 | 231 | lprintf("Command not found, Looking for %s\n",p3[0]); |
lolpcc | 1:6877bb99aa17 | 232 | } |
lolpcc | 1:6877bb99aa17 | 233 | network_write_packet(pcb,"<a href=5?ticker&1>Ticker Start</a><br>\n\r"); |
lolpcc | 1:6877bb99aa17 | 234 | network_write_packet(pcb,"<a href=5?lcd&1>String to LCD 1</a><br>\n\r"); |
lolpcc | 1:6877bb99aa17 | 235 | network_write_packet(pcb,"<a href=5?lcd&2>String to LCD 2</a><br>\n\r"); |
lolpcc | 1:6877bb99aa17 | 236 | network_write_packet(pcb,"<a href=5?sseg>Seven Segment driver test</a><br>\n\r"); |
lolpcc | 1:6877bb99aa17 | 237 | network_write_packet(pcb,tail); |
lolpcc | 1:6877bb99aa17 | 238 | tcp_close(pcb); |
lolpcc | 1:6877bb99aa17 | 239 | |
lolpcc | 1:6877bb99aa17 | 240 | break; |
lolpcc | 1:6877bb99aa17 | 241 | default : |
lolpcc | 1:6877bb99aa17 | 242 | sprintf(head,header,"MBED Board"); |
lolpcc | 1:6877bb99aa17 | 243 | sprintf(body,"<h1>404 Error</h1>\n\r"); |
lolpcc | 1:6877bb99aa17 | 244 | network_send_page(pcb,head,body,tail); |
lolpcc | 1:6877bb99aa17 | 245 | break; |
lolpcc | 1:6877bb99aa17 | 246 | } |
lolpcc | 1:6877bb99aa17 | 247 | |
lolpcc | 1:6877bb99aa17 | 248 | |
lolpcc | 1:6877bb99aa17 | 249 | |
lolpcc | 1:6877bb99aa17 | 250 | } else { |
lolpcc | 1:6877bb99aa17 | 251 | lprintf("Non GET request...\r\nRequest:\r\n%s\r\n", data); |
lolpcc | 1:6877bb99aa17 | 252 | } |
lolpcc | 1:6877bb99aa17 | 253 | |
lolpcc | 1:6877bb99aa17 | 254 | pbuf_free(p); |
lolpcc | 1:6877bb99aa17 | 255 | } |
lolpcc | 1:6877bb99aa17 | 256 | |
lolpcc | 1:6877bb99aa17 | 257 | else { |
lolpcc | 1:6877bb99aa17 | 258 | /* No data arrived */ |
lolpcc | 1:6877bb99aa17 | 259 | /* That means the client closes the connection and sent us a packet with FIN flag set to 1. */ |
lolpcc | 1:6877bb99aa17 | 260 | /* We have to cleanup and destroy out TCPConnection. */ |
lolpcc | 1:6877bb99aa17 | 261 | lprintf("Connection closed by client.\r\n"); |
lolpcc | 1:6877bb99aa17 | 262 | pbuf_free(p); |
lolpcc | 1:6877bb99aa17 | 263 | } |
lolpcc | 1:6877bb99aa17 | 264 | /* Don't panic! Everything is fine. */ |
lolpcc | 1:6877bb99aa17 | 265 | return ERR_OK; |
lolpcc | 1:6877bb99aa17 | 266 | } |
lolpcc | 1:6877bb99aa17 | 267 | /* Accept an incomming call on the registered port */ |
lolpcc | 1:6877bb99aa17 | 268 | err_t accept_callback(void *arg, struct tcp_pcb *npcb, err_t err) { |
lolpcc | 1:6877bb99aa17 | 269 | LWIP_UNUSED_ARG(arg); |
lolpcc | 1:6877bb99aa17 | 270 | /* Subscribe a receive callback function */ |
lolpcc | 1:6877bb99aa17 | 271 | tcp_recv(npcb, &recv_callback); |
lolpcc | 1:6877bb99aa17 | 272 | /* Don't panic! Everything is fine. */ |
lolpcc | 1:6877bb99aa17 | 273 | return ERR_OK; |
lolpcc | 1:6877bb99aa17 | 274 | } |
lolpcc | 1:6877bb99aa17 | 275 | |
lolpcc | 1:6877bb99aa17 | 276 | void network_init(void) |
lolpcc | 1:6877bb99aa17 | 277 | { |
lolpcc | 1:6877bb99aa17 | 278 | lprintf("l\r\nNetwork Starting Up...\r\n"); |
lolpcc | 1:6877bb99aa17 | 279 | stage = 0; |
lolpcc | 1:6877bb99aa17 | 280 | struct netif *netif = &netif_data; |
lolpcc | 1:6877bb99aa17 | 281 | struct ip_addr ipaddr; |
lolpcc | 1:6877bb99aa17 | 282 | struct ip_addr netmask; |
lolpcc | 1:6877bb99aa17 | 283 | struct ip_addr gateway; |
lolpcc | 1:6877bb99aa17 | 284 | Ticker tickFast, tickSlow, tickARP, eth_tick, dns_tick, dhcp_coarse, dhcp_fine; |
lolpcc | 1:6877bb99aa17 | 285 | // stage_blinker.attach_us(&stageblinker, 1000*500); |
lolpcc | 1:6877bb99aa17 | 286 | |
lolpcc | 1:6877bb99aa17 | 287 | char *hostname = "my-mbed"; |
lolpcc | 1:6877bb99aa17 | 288 | |
lolpcc | 1:6877bb99aa17 | 289 | lprintf("Configuring device for DHCP...\r\n"); |
lolpcc | 1:6877bb99aa17 | 290 | /* Start Network with DHCP */ |
lolpcc | 1:6877bb99aa17 | 291 | IP4_ADDR(&netmask, 255,255,255,255); |
lolpcc | 1:6877bb99aa17 | 292 | IP4_ADDR(&gateway, 0,0,0,0); |
lolpcc | 1:6877bb99aa17 | 293 | IP4_ADDR(&ipaddr, 0,0,0,0); |
lolpcc | 1:6877bb99aa17 | 294 | /* Initialise after configuration */ |
lolpcc | 1:6877bb99aa17 | 295 | lwip_init(); |
lolpcc | 1:6877bb99aa17 | 296 | netif->hwaddr_len = ETHARP_HWADDR_LEN; |
lolpcc | 1:6877bb99aa17 | 297 | device_address((char *)netif->hwaddr); |
lolpcc | 1:6877bb99aa17 | 298 | netif = netif_add(netif, &ipaddr, &netmask, &gateway, NULL, device_init, ip_input); |
lolpcc | 1:6877bb99aa17 | 299 | netif->hostname = hostname; |
lolpcc | 1:6877bb99aa17 | 300 | netif_set_default(netif); |
lolpcc | 1:6877bb99aa17 | 301 | dhcp_start(netif); // <-- Use DHCP |
lolpcc | 1:6877bb99aa17 | 302 | |
lolpcc | 1:6877bb99aa17 | 303 | /* Initialise all needed timers */ |
lolpcc | 1:6877bb99aa17 | 304 | tickARP.attach_us( ðarp_tmr, ARP_TMR_INTERVAL * 1000); |
lolpcc | 1:6877bb99aa17 | 305 | tickFast.attach_us(&tcp_fasttmr, TCP_FAST_INTERVAL * 1000); |
lolpcc | 1:6877bb99aa17 | 306 | tickSlow.attach_us(&tcp_slowtmr, TCP_SLOW_INTERVAL * 1000); |
lolpcc | 1:6877bb99aa17 | 307 | dns_tick.attach_us(&dns_tmr, DNS_TMR_INTERVAL * 1000); |
lolpcc | 1:6877bb99aa17 | 308 | dhcp_coarse.attach_us(&dhcp_coarse_tmr, DHCP_COARSE_TIMER_MSECS * 1000); |
lolpcc | 1:6877bb99aa17 | 309 | dhcp_fine.attach_us(&dhcp_fine_tmr, DHCP_FINE_TIMER_MSECS * 1000); |
lolpcc | 1:6877bb99aa17 | 310 | stage = 1; |
lolpcc | 1:6877bb99aa17 | 311 | while (!netif_is_up(netif)) { |
lolpcc | 1:6877bb99aa17 | 312 | device_poll(); |
lolpcc | 1:6877bb99aa17 | 313 | } |
lolpcc | 1:6877bb99aa17 | 314 | |
lolpcc | 1:6877bb99aa17 | 315 | /* |
lolpcc | 1:6877bb99aa17 | 316 | while (!(netif->dhcp->state == DHCP_BOUND || netif->dhcp->state == DHCP_PERMANENT)) |
lolpcc | 1:6877bb99aa17 | 317 | { |
lolpcc | 1:6877bb99aa17 | 318 | ledLink = ethernet.link(); |
lolpcc | 1:6877bb99aa17 | 319 | device_poll(); |
lolpcc | 1:6877bb99aa17 | 320 | //printf("Waiting for DHCP response, state = %d\r\n", netif->dhcp->state); |
lolpcc | 1:6877bb99aa17 | 321 | //wait_ms(100); |
lolpcc | 1:6877bb99aa17 | 322 | } |
lolpcc | 1:6877bb99aa17 | 323 | */ |
lolpcc | 1:6877bb99aa17 | 324 | stage = 2; |
lolpcc | 1:6877bb99aa17 | 325 | lprintf("Interface %02x.%02x.%02x.%02x.%02x.%02x is up, local IP is %s\r\n", |
lolpcc | 1:6877bb99aa17 | 326 | (char*) netif->hwaddr[0], |
lolpcc | 1:6877bb99aa17 | 327 | (char*) netif->hwaddr[1], |
lolpcc | 1:6877bb99aa17 | 328 | (char*) netif->hwaddr[2], |
lolpcc | 1:6877bb99aa17 | 329 | (char*) netif->hwaddr[3], |
lolpcc | 1:6877bb99aa17 | 330 | (char*) netif->hwaddr[4], |
lolpcc | 1:6877bb99aa17 | 331 | (char*) netif->hwaddr[5], |
lolpcc | 1:6877bb99aa17 | 332 | inet_ntoa(*(struct in_addr*)&(netif->ip_addr))); |
lolpcc | 1:6877bb99aa17 | 333 | |
lolpcc | 1:6877bb99aa17 | 334 | lprintf("Starting Web Server...\r\n"); |
lolpcc | 1:6877bb99aa17 | 335 | |
lolpcc | 1:6877bb99aa17 | 336 | /* Bind a function to a tcp port */ |
lolpcc | 1:6877bb99aa17 | 337 | struct tcp_pcb *pcb = tcp_new(); |
lolpcc | 1:6877bb99aa17 | 338 | if (tcp_bind(pcb, IP_ADDR_ANY, 80) == ERR_OK) { |
lolpcc | 1:6877bb99aa17 | 339 | pcb = tcp_listen(pcb); |
lolpcc | 1:6877bb99aa17 | 340 | tcp_accept(pcb, &accept_callback); |
lolpcc | 1:6877bb99aa17 | 341 | } |
lolpcc | 1:6877bb99aa17 | 342 | net_state = 1; |
lolpcc | 1:6877bb99aa17 | 343 | |
lolpcc | 1:6877bb99aa17 | 344 | lprintf("Waiting for connection...\n"); |
lolpcc | 1:6877bb99aa17 | 345 | } |
lolpcc | 1:6877bb99aa17 | 346 | |
lolpcc | 1:6877bb99aa17 | 347 | void network_test(void) |
lolpcc | 1:6877bb99aa17 | 348 | { |
lolpcc | 1:6877bb99aa17 | 349 | led_on(2); |
lolpcc | 1:6877bb99aa17 | 350 | device_poll(); |
lolpcc | 1:6877bb99aa17 | 351 | ethernet.link(); |
lolpcc | 1:6877bb99aa17 | 352 | led_off(2); |
lolpcc | 1:6877bb99aa17 | 353 | } |