These are the examples provided for [[/users/frank26080115/libraries/LPC1700CMSIS_Lib/]] Note, the entire "program" is not compilable!
Diff: EMAC/Easy_Web/easyweb.c
- Revision:
- 0:bf7b9fba3924
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/EMAC/Easy_Web/easyweb.c Sun Mar 20 05:38:56 2011 +0000 @@ -0,0 +1,187 @@ +/****************************************************************** + ***** ***** + ***** Name: easyweb.c ***** + ***** Ver.: 1.0 ***** + ***** Date: 07/05/2001 ***** + ***** Auth: Andreas Dannenberg ***** + ***** HTWK Leipzig ***** + ***** university of applied sciences ***** + ***** Germany ***** + ***** Func: implements a dynamic HTTP-server by using ***** + ***** the easyWEB-API ***** + ***** ***** + ******************************************************************/ + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include "adc.h" +#include "lpc17xx_libcfg.h" +#include "EMAC.h" // Keil: *.c -> *.h // ethernet packet driver +#define extern // Keil: Line added for modular project management + +#include "easyweb.h" +#include "tcpip.h" // Keil: *.c -> *.h // easyWEB TCP/IP stack +#include "webpage.h" // webside for our HTTP server (HTML) + +/* Example group ----------------------------------------------------------- */ +/** @defgroup EMAC_Easy_Web Easy_Web + * @ingroup EMAC_Examples + * @{ + */ + +// NXP: Include some header files that differs from the origin +int main(void) +{ + TCPLowLevelInit(); + HTTPStatus = 0; // clear HTTP-server's flag register + + TCPLocalPort = TCP_PORT_HTTP; // set port we want to listen to + + while (1) // repeat forever + { + if (!(SocketStatus & SOCK_ACTIVE)) TCPPassiveOpen(); // listen for incoming TCP-connection + DoNetworkStuff(); // handle network and easyWEB-stack + // events + HTTPServer(); + } +} + +// This function implements a very simple dynamic HTTP-server. +// It waits until connected, then sends a HTTP-header and the +// HTML-code stored in memory. Before sending, it replaces +// some special strings with dynamic values. +// NOTE: For strings crossing page boundaries, replacing will +// not work. In this case, simply add some extra lines +// (e.g. CR and LFs) to the HTML-code. + +void HTTPServer(void) +{ + if (SocketStatus & SOCK_CONNECTED) // check if somebody has connected to our TCP + { + if (SocketStatus & SOCK_DATA_AVAILABLE) // check if remote TCP sent data + TCPReleaseRxBuffer(); // and throw it away + + if (SocketStatus & SOCK_TX_BUF_RELEASED) // check if buffer is free for TX + { + if (!(HTTPStatus & HTTP_SEND_PAGE)) // init byte-counter and pointer to webside + { // if called the 1st time + HTTPBytesToSend = sizeof(WebSide) - 1; // get HTML length, ignore trailing zero + PWebSide = (unsigned char *)WebSide; // pointer to HTML-code + } + + if (HTTPBytesToSend > MAX_TCP_TX_DATA_SIZE) // transmit a segment of MAX_SIZE + { + if (!(HTTPStatus & HTTP_SEND_PAGE)) // 1st time, include HTTP-header + { + memcpy(TCP_TX_BUF, GetResponse, sizeof(GetResponse) - 1); + memcpy(TCP_TX_BUF + sizeof(GetResponse) - 1, PWebSide, MAX_TCP_TX_DATA_SIZE - sizeof(GetResponse) + 1); + HTTPBytesToSend -= MAX_TCP_TX_DATA_SIZE - sizeof(GetResponse) + 1; + PWebSide += MAX_TCP_TX_DATA_SIZE - sizeof(GetResponse) + 1; + } + else + { + memcpy(TCP_TX_BUF, PWebSide, MAX_TCP_TX_DATA_SIZE); + HTTPBytesToSend -= MAX_TCP_TX_DATA_SIZE; + PWebSide += MAX_TCP_TX_DATA_SIZE; + } + + TCPTxDataCount = MAX_TCP_TX_DATA_SIZE; // bytes to xfer + InsertDynamicValues(); // exchange some strings... + TCPTransmitTxBuffer(); // xfer buffer + } + else if (HTTPBytesToSend) // transmit leftover bytes + { + memcpy(TCP_TX_BUF, PWebSide, HTTPBytesToSend); + TCPTxDataCount = HTTPBytesToSend; // bytes to xfer + InsertDynamicValues(); // exchange some strings... + TCPTransmitTxBuffer(); // send last segment + TCPClose(); // and close connection + HTTPBytesToSend = 0; // all data sent + } + + HTTPStatus |= HTTP_SEND_PAGE; // ok, 1st loop executed + } + } + else + HTTPStatus &= ~HTTP_SEND_PAGE; // reset help-flag if not connected +} + +// samples and returns the AD-converter value of channel 2 (MCB1700 board) or channel 5 (IAR board) + +unsigned int GetAD7Val(void) +{ + unsigned int val; + ADC_startCnv(); + val = ADC_getCnv(); + ADC_stopCnv(); + return (val/40); +} + +// samples and returns AD-converter value of channel 1 + +unsigned int GetTempVal(void) +{ + // Always return (0) + return (0); +} + + +// searches the TX-buffer for special strings and replaces them +// with dynamic values (AD-converter results) + +void InsertDynamicValues(void) +{ + unsigned char *Key; + char NewKey[5]; + unsigned int i; + + if (TCPTxDataCount < 4) return; // there can't be any special string + + Key = TCP_TX_BUF; + + for (i = 0; i < (TCPTxDataCount - 3); i++) + { + if (*Key == 'A') + if (*(Key + 1) == 'D') + if (*(Key + 3) == '%') + switch (*(Key + 2)) + { + case '7' : // "AD7%"? + { + sprintf(NewKey, "%3u", GetAD7Val()); // insert AD converter value + memcpy(Key, NewKey, 3); // channel 7 (P6.7) + break; + } + case 'A' : // "ADA%"? + { + sprintf(NewKey, "%3u", GetTempVal()); // insert AD converter value + memcpy(Key, NewKey, 3); // channel 10 (temp.-diode) + break; + } + } + Key++; + } +} + +#ifdef DEBUG +/******************************************************************************* +* @brief Reports the name of the source file and the source line number +* where the CHECK_PARAM error has occurred. +* @param[in] file Pointer to the source file name +* @param[in] line assert_param error line source number +* @return None +*******************************************************************************/ +void check_failed(uint8_t *file, uint32_t line) +{ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + + /* Infinite loop */ + while(1); +} +#endif + +/* + * @} + */