]> git.sur5r.net Git - freertos/blob - Demo/lwIP_MCF5235_GCC/web.c
Ready for V5.2.0 release.
[freertos] / Demo / lwIP_MCF5235_GCC / web.c
1 /*\r
2     FreeRTOS V4.6.1 - copyright (C) 2003-2006 Richard Barry.\r
3 \r
4     This file is part of the FreeRTOS distribution.\r
5 \r
6     FreeRTOS is free software; you can redistribute it and/or modify\r
7     it under the terms of the GNU General Public License** as published by\r
8     the Free Software Foundation; either version 2 of the License, or\r
9     (at your option) any later version.\r
10 \r
11     FreeRTOS is distributed in the hope that it will be useful,\r
12     but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14     GNU General Public License for more details.\r
15 \r
16     You should have received a copy of the GNU General Public License\r
17     along with FreeRTOS; if not, write to the Free Software\r
18     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
19 \r
20     A special exception to the GPL can be applied should you wish to distribute\r
21     a combined work that includes FreeRTOS, without being obliged to provide\r
22     the source code for any proprietary components.  See the licensing section\r
23     of http://www.FreeRTOS.org for full details of how and when the exception\r
24     can be applied.\r
25 \r
26     ***************************************************************************\r
27     ***************************************************************************\r
28     *                                                                         *\r
29     * Get the FreeRTOS eBook!  See http://www.FreeRTOS.org/Documentation      *\r
30         *                                                                         *\r
31         * This is a concise, step by step, 'hands on' guide that describes both   *\r
32         * general multitasking concepts and FreeRTOS specifics. It presents and   *\r
33         * explains numerous examples that are written using the FreeRTOS API.     *\r
34         * Full source code for all the examples is provided in an accompanying    *\r
35         * .zip file.                                                              *\r
36     *                                                                         *\r
37     ***************************************************************************\r
38     ***************************************************************************\r
39 \r
40         Please ensure to read the configuration and relevant port sections of the\r
41         online documentation.\r
42 \r
43         http://www.FreeRTOS.org - Documentation, latest information, license and \r
44         contact details.\r
45 \r
46         http://www.SafeRTOS.com - A version that is certified for use in safety \r
47         critical systems.\r
48 \r
49         http://www.OpenRTOS.com - Commercial support, development, porting, \r
50         licensing and training services.\r
51 */\r
52 \r
53 /*\r
54     Implements a simplistic WEB server.  Every time a connection is made and\r
55     data is received a dynamic page that shows the current TCP/IP statistics\r
56     is generated and returned.  The connection is then closed.\r
57 \r
58     This file was adapted from a FreeRTOS lwIP slip demo supplied by a third\r
59     party.\r
60 */\r
61 \r
62 /* ------------------------ System includes ------------------------------- */\r
63 #include <stdio.h>\r
64 #include <string.h>\r
65 \r
66 /* ------------------------ FreeRTOS includes ----------------------------- */\r
67 #include "FreeRTOS.h"\r
68 #include "task.h"\r
69 #include "semphr.h"\r
70 \r
71 /* ------------------------ lwIP includes --------------------------------- */\r
72 #include "lwip/api.h"\r
73 #include "lwip/tcpip.h"\r
74 #include "lwip/memp.h"\r
75 #include "lwip/stats.h"\r
76 #include "netif/loopif.h"\r
77 \r
78 /* ------------------------ Project includes ------------------------------ */\r
79 #include "mcf5xxx.h"\r
80 #include "mcf523x.h"\r
81 #include "netif/fec.h"\r
82 \r
83 #include "web.h"\r
84 \r
85 /* ------------------------ Defines --------------------------------------- */\r
86 /* The size of the buffer in which the dynamic WEB page is created. */\r
87 #define webMAX_PAGE_SIZE        ( 2048 )\r
88 \r
89 /* Standard GET response. */\r
90 #define webHTTP_OK  "HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n"\r
91 \r
92 /* The port on which we listen. */\r
93 #define webHTTP_PORT            ( 80 )\r
94 \r
95 /* Delay on close error. */\r
96 #define webSHORT_DELAY          ( 10 )\r
97 \r
98 /* Format of the dynamic page that is returned on each connection. */\r
99 #define webHTML_START \\r
100 "<html>\\r
101 <head>\\r
102 </head>\\r
103 <BODY onLoad=\"window.setTimeout(&quot;location.href='index.html'&quot;,1000)\"bgcolor=\"#CCCCff\">\\r
104 \r\nPage Hits = "\r
105 \r
106 #define webHTML_END \\r
107 "\r\n" \\r
108 "FreeRTOS MCF5235 port (c) 2006 by Christian Walter &lt;wolti@sil.at&gt;\r\n" \\r
109 "</pre>\r\n" \\r
110 "</BODY>\r\n" \\r
111 "</html>"\r
112 \r
113 /* ------------------------ Prototypes ------------------------------------ */\r
114 static void     vProcessConnection( struct netconn *pxNetCon );\r
115 \r
116 /*------------------------------------------------------------*/\r
117 \r
118 /*\r
119  * Process an incoming connection on port 80.\r
120  *\r
121  * This simply checks to see if the incoming data contains a GET request, and\r
122  * if so sends back a single dynamically created page.  The connection is then\r
123  * closed.  A more complete implementation could create a task for each\r
124  * connection.\r
125  */\r
126 static void\r
127 vProcessConnection( struct netconn *pxNetCon )\r
128 {\r
129     static portCHAR cDynamicPage[webMAX_PAGE_SIZE], cPageHits[11];\r
130     struct netbuf  *pxRxBuffer;\r
131     portCHAR       *pcRxString;\r
132     unsigned portSHORT usLength;\r
133     static unsigned portLONG ulPageHits = 0;\r
134 \r
135     /* We expect to immediately get data. */\r
136     pxRxBuffer = netconn_recv( pxNetCon );\r
137 \r
138     if( pxRxBuffer != NULL )\r
139     {\r
140         /* Where is the data? */\r
141         netbuf_data( pxRxBuffer, ( void * )&pcRxString, &usLength );\r
142 \r
143         /* Is this a GET?  We don't handle anything else. */\r
144         if( !strncmp( pcRxString, "GET", 3 ) )\r
145         {\r
146             pcRxString = cDynamicPage;\r
147 \r
148             /* Update the hit count. */\r
149             ulPageHits++;\r
150             sprintf( cPageHits, "%lu", ulPageHits );\r
151 \r
152             /* Write out the HTTP OK header. */\r
153             netconn_write( pxNetCon, webHTTP_OK, ( u16_t ) strlen( webHTTP_OK ), NETCONN_COPY );\r
154 \r
155             /* Generate the dynamic page...\r
156 \r
157                ... First the page header. */\r
158             strcpy( cDynamicPage, webHTML_START );\r
159             /* ... Then the hit count... */\r
160             strcat( cDynamicPage, cPageHits );\r
161             strcat( cDynamicPage,\r
162                     "<p><pre>Task          State  Priority  Stack #<br>************************************************<br>" );\r
163             /* ... Then the list of tasks and their status... */\r
164             vTaskList( ( signed portCHAR * )cDynamicPage + strlen( cDynamicPage ) );\r
165             /* ... Finally the page footer. */\r
166             strcat( cDynamicPage, webHTML_END );\r
167 \r
168             /* Write out the dynamically generated page. */\r
169             netconn_write( pxNetCon, cDynamicPage, ( u16_t ) strlen( cDynamicPage ), NETCONN_COPY );\r
170         }\r
171 \r
172         netbuf_delete( pxRxBuffer );\r
173     }\r
174 \r
175     netconn_close( pxNetCon );\r
176 }\r
177 \r
178 /*------------------------------------------------------------*/\r
179 \r
180 void\r
181 vlwIPInit( void )\r
182 {\r
183     /* Initialize lwIP and its interface layer. */\r
184     sys_init(  );\r
185     mem_init(  );\r
186     memp_init(  );\r
187     pbuf_init(  );\r
188     netif_init(  );\r
189     ip_init(  );\r
190     tcpip_init( NULL, NULL );\r
191 }\r
192 \r
193 /*------------------------------------------------------------*/\r
194 \r
195 void\r
196 vBasicWEBServer( void *pvParameters )\r
197 {\r
198     struct netconn *pxHTTPListener, *pxNewConnection;\r
199     struct ip_addr  xIpAddr, xNetMast, xGateway;\r
200     static struct netif fec523x_if;\r
201 \r
202     /* Parameters are not used - suppress compiler error. */\r
203     ( void )pvParameters;\r
204 \r
205     /* Create and configure the EMAC interface. */\r
206     IP4_ADDR( &xIpAddr, 10, 0, 10, 2 );\r
207     IP4_ADDR( &xNetMast, 255, 255, 255, 0 );\r
208     IP4_ADDR( &xGateway, 10, 0, 10, 1 );\r
209     netif_add( &fec523x_if, &xIpAddr, &xNetMast, &xGateway, NULL, mcf523xfec_init, tcpip_input );\r
210 \r
211     /* make it the default interface */\r
212     netif_set_default( &fec523x_if );\r
213 \r
214     /* bring it up */\r
215     netif_set_up( &fec523x_if );\r
216 \r
217     /* Create a new tcp connection handle */\r
218     pxHTTPListener = netconn_new( NETCONN_TCP );\r
219     netconn_bind( pxHTTPListener, NULL, webHTTP_PORT );\r
220     netconn_listen( pxHTTPListener );\r
221 \r
222     /* Loop forever */\r
223     for( ;; )\r
224     {\r
225         /* Wait for connection. */\r
226         pxNewConnection = netconn_accept( pxHTTPListener );\r
227 \r
228         if( pxNewConnection != NULL )\r
229         {\r
230             /* Service connection. */\r
231             vProcessConnection( pxNewConnection );\r
232             while( netconn_delete( pxNewConnection ) != ERR_OK )\r
233             {\r
234                 vTaskDelay( webSHORT_DELAY );\r
235             }\r
236         }\r
237     }\r
238 }\r