Igor Skochinsky
/
EasyWebCR
code_red's port of EasyWeb server for LPC1768, made to compile with mbed's online compiler.
easyweb.c@0:12b53511e212, 2010-01-29 (annotated)
- Committer:
- igorsk
- Date:
- Fri Jan 29 21:46:31 2010 +0000
- Revision:
- 0:12b53511e212
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
igorsk | 0:12b53511e212 | 1 | /****************************************************************** |
igorsk | 0:12b53511e212 | 2 | ***** ***** |
igorsk | 0:12b53511e212 | 3 | ***** Name: easyweb.c ***** |
igorsk | 0:12b53511e212 | 4 | ***** Ver.: 1.0 ***** |
igorsk | 0:12b53511e212 | 5 | ***** Date: 07/05/2001 ***** |
igorsk | 0:12b53511e212 | 6 | ***** Auth: Andreas Dannenberg ***** |
igorsk | 0:12b53511e212 | 7 | ***** HTWK Leipzig ***** |
igorsk | 0:12b53511e212 | 8 | ***** university of applied sciences ***** |
igorsk | 0:12b53511e212 | 9 | ***** Germany ***** |
igorsk | 0:12b53511e212 | 10 | ***** adannenb@et.htwk-leipzig.de ***** |
igorsk | 0:12b53511e212 | 11 | ***** Func: implements a dynamic HTTP-server by using ***** |
igorsk | 0:12b53511e212 | 12 | ***** the easyWEB-API ***** |
igorsk | 0:12b53511e212 | 13 | ***** Rem.: In IAR-C, use linker option ***** |
igorsk | 0:12b53511e212 | 14 | ***** "-e_medium_write=_formatted_write" ***** |
igorsk | 0:12b53511e212 | 15 | ***** ***** |
igorsk | 0:12b53511e212 | 16 | ******************************************************************/ |
igorsk | 0:12b53511e212 | 17 | |
igorsk | 0:12b53511e212 | 18 | // Modifications by Code Red Technologies for NXP LPC1768 |
igorsk | 0:12b53511e212 | 19 | |
igorsk | 0:12b53511e212 | 20 | // CodeRed - removed header for MSP430 microcontroller |
igorsk | 0:12b53511e212 | 21 | //#include "msp430x14x.h" |
igorsk | 0:12b53511e212 | 22 | |
igorsk | 0:12b53511e212 | 23 | #include "mbed.h" |
igorsk | 0:12b53511e212 | 24 | |
igorsk | 0:12b53511e212 | 25 | #include "stdlib.h" |
igorsk | 0:12b53511e212 | 26 | #include "stdio.h" |
igorsk | 0:12b53511e212 | 27 | #include "string.h" |
igorsk | 0:12b53511e212 | 28 | |
igorsk | 0:12b53511e212 | 29 | #include "easyweb.h" |
igorsk | 0:12b53511e212 | 30 | |
igorsk | 0:12b53511e212 | 31 | // CodeRed - removed header for original ethernet controller |
igorsk | 0:12b53511e212 | 32 | //#include "cs8900.c" // ethernet packet driver |
igorsk | 0:12b53511e212 | 33 | |
igorsk | 0:12b53511e212 | 34 | //CodeRed - added for LPC ethernet controller |
igorsk | 0:12b53511e212 | 35 | #include "ethmac.h" |
igorsk | 0:12b53511e212 | 36 | |
igorsk | 0:12b53511e212 | 37 | // CodeRed - include .h rather than .c file |
igorsk | 0:12b53511e212 | 38 | // #include "tcpip.c" // easyWEB TCP/IP stack |
igorsk | 0:12b53511e212 | 39 | #include "tcpip.h" // easyWEB TCP/IP stack |
igorsk | 0:12b53511e212 | 40 | |
igorsk | 0:12b53511e212 | 41 | // CodeRed - added NXP LPC register definitions header |
igorsk | 0:12b53511e212 | 42 | // CodeRed - include renamed .h rather than .c file |
igorsk | 0:12b53511e212 | 43 | // #include "webside.c" // webside for our HTTP server (HTML) |
igorsk | 0:12b53511e212 | 44 | #include "webside.h" // webside for our HTTP server (HTML) |
igorsk | 0:12b53511e212 | 45 | |
igorsk | 0:12b53511e212 | 46 | |
igorsk | 0:12b53511e212 | 47 | |
igorsk | 0:12b53511e212 | 48 | // CodeRed - added for use in dynamic side of web page |
igorsk | 0:12b53511e212 | 49 | unsigned int aaPagecounter=0; |
igorsk | 0:12b53511e212 | 50 | unsigned int adcValue = 0; |
igorsk | 0:12b53511e212 | 51 | |
igorsk | 0:12b53511e212 | 52 | int main (void) |
igorsk | 0:12b53511e212 | 53 | { |
igorsk | 0:12b53511e212 | 54 | // CodeRed - removed init functions as not required for LPC1776 |
igorsk | 0:12b53511e212 | 55 | // InitOsc(); |
igorsk | 0:12b53511e212 | 56 | // InitPorts(); |
igorsk | 0:12b53511e212 | 57 | |
igorsk | 0:12b53511e212 | 58 | |
igorsk | 0:12b53511e212 | 59 | // CodeRed - added info message |
igorsk | 0:12b53511e212 | 60 | printf("Setting up TCP/IP with IP address: "); |
igorsk | 0:12b53511e212 | 61 | printf("%d.%d.%d.%d\n",MYIP_1,MYIP_2,MYIP_3,MYIP_4); |
igorsk | 0:12b53511e212 | 62 | |
igorsk | 0:12b53511e212 | 63 | TCPLowLevelInit(); |
igorsk | 0:12b53511e212 | 64 | |
igorsk | 0:12b53511e212 | 65 | /* |
igorsk | 0:12b53511e212 | 66 | *(unsigned char *)RemoteIP = 24; // uncomment those lines to get the |
igorsk | 0:12b53511e212 | 67 | *((unsigned char *)RemoteIP + 1) = 8; // quote of the day from a real |
igorsk | 0:12b53511e212 | 68 | *((unsigned char *)RemoteIP + 2) = 69; // internet server! (gateway must be |
igorsk | 0:12b53511e212 | 69 | *((unsigned char *)RemoteIP + 3) = 7; // set to your LAN-router) |
igorsk | 0:12b53511e212 | 70 | |
igorsk | 0:12b53511e212 | 71 | TCPLocalPort = 2025; |
igorsk | 0:12b53511e212 | 72 | TCPRemotePort = TCP_PORT_QOTD; |
igorsk | 0:12b53511e212 | 73 | |
igorsk | 0:12b53511e212 | 74 | TCPActiveOpen(); |
igorsk | 0:12b53511e212 | 75 | |
igorsk | 0:12b53511e212 | 76 | while (SocketStatus & SOCK_ACTIVE) // read the quote from memory |
igorsk | 0:12b53511e212 | 77 | { // by using the hardware-debugger |
igorsk | 0:12b53511e212 | 78 | DoNetworkStuff(); |
igorsk | 0:12b53511e212 | 79 | } |
igorsk | 0:12b53511e212 | 80 | */ |
igorsk | 0:12b53511e212 | 81 | |
igorsk | 0:12b53511e212 | 82 | HTTPStatus = 0; // clear HTTP-server's flag register |
igorsk | 0:12b53511e212 | 83 | |
igorsk | 0:12b53511e212 | 84 | TCPLocalPort = TCP_PORT_HTTP; // set port we want to listen to |
igorsk | 0:12b53511e212 | 85 | |
igorsk | 0:12b53511e212 | 86 | // CodeRed - added info message |
igorsk | 0:12b53511e212 | 87 | printf("Webserver started\n"); |
igorsk | 0:12b53511e212 | 88 | |
igorsk | 0:12b53511e212 | 89 | while (1) // repeat forever |
igorsk | 0:12b53511e212 | 90 | { |
igorsk | 0:12b53511e212 | 91 | if (!(SocketStatus & SOCK_ACTIVE)) TCPPassiveOpen(); // listen for incoming TCP-connection |
igorsk | 0:12b53511e212 | 92 | DoNetworkStuff(); // handle network and easyWEB-stack |
igorsk | 0:12b53511e212 | 93 | // events |
igorsk | 0:12b53511e212 | 94 | HTTPServer(); |
igorsk | 0:12b53511e212 | 95 | } |
igorsk | 0:12b53511e212 | 96 | } |
igorsk | 0:12b53511e212 | 97 | |
igorsk | 0:12b53511e212 | 98 | // This function implements a very simple dynamic HTTP-server. |
igorsk | 0:12b53511e212 | 99 | // It waits until connected, then sends a HTTP-header and the |
igorsk | 0:12b53511e212 | 100 | // HTML-code stored in memory. Before sending, it replaces |
igorsk | 0:12b53511e212 | 101 | // some special strings with dynamic values. |
igorsk | 0:12b53511e212 | 102 | // NOTE: For strings crossing page boundaries, replacing will |
igorsk | 0:12b53511e212 | 103 | // not work. In this case, simply add some extra lines |
igorsk | 0:12b53511e212 | 104 | // (e.g. CR and LFs) to the HTML-code. |
igorsk | 0:12b53511e212 | 105 | |
igorsk | 0:12b53511e212 | 106 | void HTTPServer(void) |
igorsk | 0:12b53511e212 | 107 | { |
igorsk | 0:12b53511e212 | 108 | if (SocketStatus & SOCK_CONNECTED) // check if somebody has connected to our TCP |
igorsk | 0:12b53511e212 | 109 | { |
igorsk | 0:12b53511e212 | 110 | if (SocketStatus & SOCK_DATA_AVAILABLE) // check if remote TCP sent data |
igorsk | 0:12b53511e212 | 111 | TCPReleaseRxBuffer(); // and throw it away |
igorsk | 0:12b53511e212 | 112 | |
igorsk | 0:12b53511e212 | 113 | if (SocketStatus & SOCK_TX_BUF_RELEASED) // check if buffer is free for TX |
igorsk | 0:12b53511e212 | 114 | { |
igorsk | 0:12b53511e212 | 115 | if (!(HTTPStatus & HTTP_SEND_PAGE)) // init byte-counter and pointer to webside |
igorsk | 0:12b53511e212 | 116 | { // if called the 1st time |
igorsk | 0:12b53511e212 | 117 | HTTPBytesToSend = sizeof(WebSide) - 1; // get HTML length, ignore trailing zero |
igorsk | 0:12b53511e212 | 118 | PWebSide = (unsigned char *)WebSide; // pointer to HTML-code |
igorsk | 0:12b53511e212 | 119 | } |
igorsk | 0:12b53511e212 | 120 | |
igorsk | 0:12b53511e212 | 121 | if (HTTPBytesToSend > MAX_TCP_TX_DATA_SIZE) // transmit a segment of MAX_SIZE |
igorsk | 0:12b53511e212 | 122 | { |
igorsk | 0:12b53511e212 | 123 | if (!(HTTPStatus & HTTP_SEND_PAGE)) // 1st time, include HTTP-header |
igorsk | 0:12b53511e212 | 124 | { |
igorsk | 0:12b53511e212 | 125 | memcpy(TCP_TX_BUF, GetResponse, sizeof(GetResponse) - 1); |
igorsk | 0:12b53511e212 | 126 | memcpy(TCP_TX_BUF + sizeof(GetResponse) - 1, PWebSide, MAX_TCP_TX_DATA_SIZE - sizeof(GetResponse) + 1); |
igorsk | 0:12b53511e212 | 127 | HTTPBytesToSend -= MAX_TCP_TX_DATA_SIZE - sizeof(GetResponse) + 1; |
igorsk | 0:12b53511e212 | 128 | PWebSide += MAX_TCP_TX_DATA_SIZE - sizeof(GetResponse) + 1; |
igorsk | 0:12b53511e212 | 129 | } |
igorsk | 0:12b53511e212 | 130 | else |
igorsk | 0:12b53511e212 | 131 | { |
igorsk | 0:12b53511e212 | 132 | memcpy(TCP_TX_BUF, PWebSide, MAX_TCP_TX_DATA_SIZE); |
igorsk | 0:12b53511e212 | 133 | HTTPBytesToSend -= MAX_TCP_TX_DATA_SIZE; |
igorsk | 0:12b53511e212 | 134 | PWebSide += MAX_TCP_TX_DATA_SIZE; |
igorsk | 0:12b53511e212 | 135 | } |
igorsk | 0:12b53511e212 | 136 | |
igorsk | 0:12b53511e212 | 137 | TCPTxDataCount = MAX_TCP_TX_DATA_SIZE; // bytes to xfer |
igorsk | 0:12b53511e212 | 138 | InsertDynamicValues(); // exchange some strings... |
igorsk | 0:12b53511e212 | 139 | TCPTransmitTxBuffer(); // xfer buffer |
igorsk | 0:12b53511e212 | 140 | } |
igorsk | 0:12b53511e212 | 141 | else if (HTTPBytesToSend) // transmit leftover bytes |
igorsk | 0:12b53511e212 | 142 | { |
igorsk | 0:12b53511e212 | 143 | memcpy(TCP_TX_BUF, PWebSide, HTTPBytesToSend); |
igorsk | 0:12b53511e212 | 144 | TCPTxDataCount = HTTPBytesToSend; // bytes to xfer |
igorsk | 0:12b53511e212 | 145 | InsertDynamicValues(); // exchange some strings... |
igorsk | 0:12b53511e212 | 146 | TCPTransmitTxBuffer(); // send last segment |
igorsk | 0:12b53511e212 | 147 | TCPClose(); // and close connection |
igorsk | 0:12b53511e212 | 148 | HTTPBytesToSend = 0; // all data sent |
igorsk | 0:12b53511e212 | 149 | } |
igorsk | 0:12b53511e212 | 150 | |
igorsk | 0:12b53511e212 | 151 | HTTPStatus |= HTTP_SEND_PAGE; // ok, 1st loop executed |
igorsk | 0:12b53511e212 | 152 | } |
igorsk | 0:12b53511e212 | 153 | } |
igorsk | 0:12b53511e212 | 154 | else |
igorsk | 0:12b53511e212 | 155 | HTTPStatus &= ~HTTP_SEND_PAGE; // reset help-flag if not connected |
igorsk | 0:12b53511e212 | 156 | } |
igorsk | 0:12b53511e212 | 157 | |
igorsk | 0:12b53511e212 | 158 | |
igorsk | 0:12b53511e212 | 159 | |
igorsk | 0:12b53511e212 | 160 | |
igorsk | 0:12b53511e212 | 161 | // Code Red - GetAD7Val function replaced |
igorsk | 0:12b53511e212 | 162 | // Rather than using the AD convertor, in this version we simply increment |
igorsk | 0:12b53511e212 | 163 | // a counter the function is called, wrapping at 1024. |
igorsk | 0:12b53511e212 | 164 | volatile unsigned int aaScrollbar = 400; |
igorsk | 0:12b53511e212 | 165 | |
igorsk | 0:12b53511e212 | 166 | unsigned int GetAD7Val(void) |
igorsk | 0:12b53511e212 | 167 | { |
igorsk | 0:12b53511e212 | 168 | aaScrollbar = (aaScrollbar +16) % 1024; |
igorsk | 0:12b53511e212 | 169 | adcValue = (aaScrollbar / 10) * 1000/1024; |
igorsk | 0:12b53511e212 | 170 | return aaScrollbar; |
igorsk | 0:12b53511e212 | 171 | } |
igorsk | 0:12b53511e212 | 172 | |
igorsk | 0:12b53511e212 | 173 | // Code Red - Original MSP430 version of GetAD7Val() removed |
igorsk | 0:12b53511e212 | 174 | /* |
igorsk | 0:12b53511e212 | 175 | // samples and returns the AD-converter value of channel 7 |
igorsk | 0:12b53511e212 | 176 | // (associated with Port P6.7) |
igorsk | 0:12b53511e212 | 177 | |
igorsk | 0:12b53511e212 | 178 | unsigned int GetAD7Val(void) |
igorsk | 0:12b53511e212 | 179 | { |
igorsk | 0:12b53511e212 | 180 | ADC12CTL0 = ADC12ON | SHT0_15 | REF2_5V | REFON; // ADC on, int. ref. on (2,5 V), |
igorsk | 0:12b53511e212 | 181 | // single channel single conversion |
igorsk | 0:12b53511e212 | 182 | ADC12CTL1 = ADC12SSEL_2 | ADC12DIV_7 | CSTARTADD_0 | SHP;// MCLK / 8 = 1 MHz |
igorsk | 0:12b53511e212 | 183 | |
igorsk | 0:12b53511e212 | 184 | ADC12MCTL0 = SREF_1 | INCH_7; // int. ref., channel 7 |
igorsk | 0:12b53511e212 | 185 | |
igorsk | 0:12b53511e212 | 186 | ADC12CTL0 |= ENC; // enable conversion |
igorsk | 0:12b53511e212 | 187 | ADC12CTL0 |= ADC12SC; // sample & convert |
igorsk | 0:12b53511e212 | 188 | |
igorsk | 0:12b53511e212 | 189 | while (ADC12CTL0 & ADC12SC); // wait until conversion is complete |
igorsk | 0:12b53511e212 | 190 | |
igorsk | 0:12b53511e212 | 191 | ADC12CTL0 &= ~ENC; // disable conversion |
igorsk | 0:12b53511e212 | 192 | |
igorsk | 0:12b53511e212 | 193 | return ADC12MEM0 / 41; // scale 12 bit value to 0..100% |
igorsk | 0:12b53511e212 | 194 | } |
igorsk | 0:12b53511e212 | 195 | |
igorsk | 0:12b53511e212 | 196 | // End of Original MSP430 version of GetAD7Val() |
igorsk | 0:12b53511e212 | 197 | */ |
igorsk | 0:12b53511e212 | 198 | |
igorsk | 0:12b53511e212 | 199 | |
igorsk | 0:12b53511e212 | 200 | // Code Red - Original GetTempVal() removed |
igorsk | 0:12b53511e212 | 201 | // Function no longer used |
igorsk | 0:12b53511e212 | 202 | /* |
igorsk | 0:12b53511e212 | 203 | // samples and returns AD-converter value of channel 10 |
igorsk | 0:12b53511e212 | 204 | // (MSP430's internal temperature reference diode) |
igorsk | 0:12b53511e212 | 205 | // NOTE: to get a more exact value, 8-times oversampling is used |
igorsk | 0:12b53511e212 | 206 | |
igorsk | 0:12b53511e212 | 207 | unsigned int GetTempVal(void) |
igorsk | 0:12b53511e212 | 208 | { |
igorsk | 0:12b53511e212 | 209 | unsigned long ReturnValue; |
igorsk | 0:12b53511e212 | 210 | |
igorsk | 0:12b53511e212 | 211 | ADC12CTL0 = ADC12ON | SHT0_15 | MSH | REFON; // ADC on, int. ref. on (1,5 V), |
igorsk | 0:12b53511e212 | 212 | // multiple sample & conversion |
igorsk | 0:12b53511e212 | 213 | ADC12CTL1 = ADC12SSEL_2 | ADC12DIV_7 | CSTARTADD_0 | CONSEQ_1 | SHP; // MCLK / 8 = 1 MHz |
igorsk | 0:12b53511e212 | 214 | |
igorsk | 0:12b53511e212 | 215 | ADC12MCTL0 = SREF_1 | INCH_10; // int. ref., channel 10 |
igorsk | 0:12b53511e212 | 216 | ADC12MCTL1 = SREF_1 | INCH_10; // int. ref., channel 10 |
igorsk | 0:12b53511e212 | 217 | ADC12MCTL2 = SREF_1 | INCH_10; // int. ref., channel 10 |
igorsk | 0:12b53511e212 | 218 | ADC12MCTL3 = SREF_1 | INCH_10; // int. ref., channel 10 |
igorsk | 0:12b53511e212 | 219 | ADC12MCTL4 = SREF_1 | INCH_10; // int. ref., channel 10 |
igorsk | 0:12b53511e212 | 220 | ADC12MCTL5 = SREF_1 | INCH_10; // int. ref., channel 10 |
igorsk | 0:12b53511e212 | 221 | ADC12MCTL6 = SREF_1 | INCH_10; // int. ref., channel 10 |
igorsk | 0:12b53511e212 | 222 | ADC12MCTL7 = EOS | SREF_1 | INCH_10; // int. ref., channel 10, last seg. |
igorsk | 0:12b53511e212 | 223 | |
igorsk | 0:12b53511e212 | 224 | ADC12CTL0 |= ENC; // enable conversion |
igorsk | 0:12b53511e212 | 225 | ADC12CTL0 |= ADC12SC; // sample & convert |
igorsk | 0:12b53511e212 | 226 | |
igorsk | 0:12b53511e212 | 227 | while (ADC12CTL0 & ADC12SC); // wait until conversion is complete |
igorsk | 0:12b53511e212 | 228 | |
igorsk | 0:12b53511e212 | 229 | ADC12CTL0 &= ~ENC; // disable conversion |
igorsk | 0:12b53511e212 | 230 | |
igorsk | 0:12b53511e212 | 231 | ReturnValue = ADC12MEM0; // sum up values... |
igorsk | 0:12b53511e212 | 232 | ReturnValue += ADC12MEM1; |
igorsk | 0:12b53511e212 | 233 | ReturnValue += ADC12MEM2; |
igorsk | 0:12b53511e212 | 234 | ReturnValue += ADC12MEM3; |
igorsk | 0:12b53511e212 | 235 | ReturnValue += ADC12MEM4; |
igorsk | 0:12b53511e212 | 236 | ReturnValue += ADC12MEM5; |
igorsk | 0:12b53511e212 | 237 | ReturnValue += ADC12MEM6; |
igorsk | 0:12b53511e212 | 238 | ReturnValue += ADC12MEM7; |
igorsk | 0:12b53511e212 | 239 | |
igorsk | 0:12b53511e212 | 240 | ReturnValue >>= 3; // ... and divide by 8 |
igorsk | 0:12b53511e212 | 241 | |
igorsk | 0:12b53511e212 | 242 | if (ReturnValue < 2886) ReturnValue = 2886; // lower bound (0% = 20�C) |
igorsk | 0:12b53511e212 | 243 | ReturnValue = (ReturnValue - 2886) / 2.43; // convert AD-value to a temperature from |
igorsk | 0:12b53511e212 | 244 | // 20�C...45�C represented by a value |
igorsk | 0:12b53511e212 | 245 | // of 0...100% |
igorsk | 0:12b53511e212 | 246 | if (ReturnValue > 100) ReturnValue = 100; // upper bound (100% = 45�C) |
igorsk | 0:12b53511e212 | 247 | |
igorsk | 0:12b53511e212 | 248 | return ReturnValue; |
igorsk | 0:12b53511e212 | 249 | } |
igorsk | 0:12b53511e212 | 250 | // End of Original MSP430 version of GetTempVal() |
igorsk | 0:12b53511e212 | 251 | */ |
igorsk | 0:12b53511e212 | 252 | |
igorsk | 0:12b53511e212 | 253 | |
igorsk | 0:12b53511e212 | 254 | // searches the TX-buffer for special strings and replaces them |
igorsk | 0:12b53511e212 | 255 | // with dynamic values (AD-converter results) |
igorsk | 0:12b53511e212 | 256 | |
igorsk | 0:12b53511e212 | 257 | // Code Red - new version of InsertDynamicValues() |
igorsk | 0:12b53511e212 | 258 | void InsertDynamicValues(void) |
igorsk | 0:12b53511e212 | 259 | { |
igorsk | 0:12b53511e212 | 260 | unsigned char *Key; |
igorsk | 0:12b53511e212 | 261 | char NewKey[6]; |
igorsk | 0:12b53511e212 | 262 | unsigned int i; |
igorsk | 0:12b53511e212 | 263 | |
igorsk | 0:12b53511e212 | 264 | if (TCPTxDataCount < 4) return; // there can't be any special string |
igorsk | 0:12b53511e212 | 265 | |
igorsk | 0:12b53511e212 | 266 | Key = TCP_TX_BUF; |
igorsk | 0:12b53511e212 | 267 | |
igorsk | 0:12b53511e212 | 268 | for (i = 0; i < (TCPTxDataCount - 3); i++) |
igorsk | 0:12b53511e212 | 269 | { |
igorsk | 0:12b53511e212 | 270 | if (*Key == 'A') |
igorsk | 0:12b53511e212 | 271 | if (*(Key + 1) == 'D') |
igorsk | 0:12b53511e212 | 272 | if (*(Key + 3) == '%') |
igorsk | 0:12b53511e212 | 273 | switch (*(Key + 2)) |
igorsk | 0:12b53511e212 | 274 | { |
igorsk | 0:12b53511e212 | 275 | case '8' : // "AD8%"? |
igorsk | 0:12b53511e212 | 276 | { |
igorsk | 0:12b53511e212 | 277 | sprintf(NewKey, "%04d", GetAD7Val()); // insert pseudo-ADconverter value |
igorsk | 0:12b53511e212 | 278 | memcpy(Key, NewKey, 4); |
igorsk | 0:12b53511e212 | 279 | break; |
igorsk | 0:12b53511e212 | 280 | } |
igorsk | 0:12b53511e212 | 281 | case '7' : // "AD7%"? |
igorsk | 0:12b53511e212 | 282 | { |
igorsk | 0:12b53511e212 | 283 | sprintf(NewKey, "%3u", adcValue); // copy saved value from previous read |
igorsk | 0:12b53511e212 | 284 | memcpy(Key, NewKey, 3); |
igorsk | 0:12b53511e212 | 285 | break; |
igorsk | 0:12b53511e212 | 286 | } |
igorsk | 0:12b53511e212 | 287 | case '1' : // "AD1%"? |
igorsk | 0:12b53511e212 | 288 | { |
igorsk | 0:12b53511e212 | 289 | sprintf(NewKey, "%4u", ++aaPagecounter); // increment and insert page counter |
igorsk | 0:12b53511e212 | 290 | memcpy(Key, NewKey, 4); |
igorsk | 0:12b53511e212 | 291 | // *(Key + 3) = ' '; |
igorsk | 0:12b53511e212 | 292 | break; |
igorsk | 0:12b53511e212 | 293 | } |
igorsk | 0:12b53511e212 | 294 | } |
igorsk | 0:12b53511e212 | 295 | Key++; |
igorsk | 0:12b53511e212 | 296 | } |
igorsk | 0:12b53511e212 | 297 | } |
igorsk | 0:12b53511e212 | 298 | |
igorsk | 0:12b53511e212 | 299 | |
igorsk | 0:12b53511e212 | 300 | // Code Red - commented out original InsertDynamicValues() |
igorsk | 0:12b53511e212 | 301 | /* |
igorsk | 0:12b53511e212 | 302 | void InsertDynamicValues(void) |
igorsk | 0:12b53511e212 | 303 | { |
igorsk | 0:12b53511e212 | 304 | unsigned char *Key; |
igorsk | 0:12b53511e212 | 305 | unsigned char NewKey[5]; |
igorsk | 0:12b53511e212 | 306 | unsigned int i; |
igorsk | 0:12b53511e212 | 307 | |
igorsk | 0:12b53511e212 | 308 | if (TCPTxDataCount < 4) return; // there can't be any special string |
igorsk | 0:12b53511e212 | 309 | |
igorsk | 0:12b53511e212 | 310 | Key = TCP_TX_BUF; |
igorsk | 0:12b53511e212 | 311 | |
igorsk | 0:12b53511e212 | 312 | for (i = 0; i < (TCPTxDataCount - 3); i++) |
igorsk | 0:12b53511e212 | 313 | { |
igorsk | 0:12b53511e212 | 314 | if (*Key == 'A') |
igorsk | 0:12b53511e212 | 315 | if (*(Key + 1) == 'D') |
igorsk | 0:12b53511e212 | 316 | if (*(Key + 3) == '%') |
igorsk | 0:12b53511e212 | 317 | switch (*(Key + 2)) |
igorsk | 0:12b53511e212 | 318 | { |
igorsk | 0:12b53511e212 | 319 | case '7' : // "AD7%"? |
igorsk | 0:12b53511e212 | 320 | { |
igorsk | 0:12b53511e212 | 321 | sprintf(NewKey, "%3u", GetAD7Val()); // insert AD converter value |
igorsk | 0:12b53511e212 | 322 | memcpy(Key, NewKey, 3); // channel 7 (P6.7) |
igorsk | 0:12b53511e212 | 323 | break; |
igorsk | 0:12b53511e212 | 324 | } |
igorsk | 0:12b53511e212 | 325 | case 'A' : // "ADA%"? |
igorsk | 0:12b53511e212 | 326 | { |
igorsk | 0:12b53511e212 | 327 | sprintf(NewKey, "%3u", GetTempVal()); // insert AD converter value |
igorsk | 0:12b53511e212 | 328 | memcpy(Key, NewKey, 3); // channel 10 (temp.-diode) |
igorsk | 0:12b53511e212 | 329 | break; |
igorsk | 0:12b53511e212 | 330 | } |
igorsk | 0:12b53511e212 | 331 | } |
igorsk | 0:12b53511e212 | 332 | Key++; |
igorsk | 0:12b53511e212 | 333 | } |
igorsk | 0:12b53511e212 | 334 | } |
igorsk | 0:12b53511e212 | 335 | |
igorsk | 0:12b53511e212 | 336 | // Code Red - End of original InsertDynamicValues () |
igorsk | 0:12b53511e212 | 337 | */ |
igorsk | 0:12b53511e212 | 338 | |
igorsk | 0:12b53511e212 | 339 | // Code Red - Deleted InitOsc() and InitPorts() as not required |
igorsk | 0:12b53511e212 | 340 | // by LPC 1776 |
igorsk | 0:12b53511e212 | 341 | |
igorsk | 0:12b53511e212 | 342 | /* |
igorsk | 0:12b53511e212 | 343 | // enables the 8MHz crystal on XT1 and use |
igorsk | 0:12b53511e212 | 344 | // it as MCLK |
igorsk | 0:12b53511e212 | 345 | |
igorsk | 0:12b53511e212 | 346 | void InitOsc(void) |
igorsk | 0:12b53511e212 | 347 | { |
igorsk | 0:12b53511e212 | 348 | WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer |
igorsk | 0:12b53511e212 | 349 | |
igorsk | 0:12b53511e212 | 350 | BCSCTL1 |= XTS; // XT1 as high-frequency |
igorsk | 0:12b53511e212 | 351 | _BIC_SR(OSCOFF); // turn on XT1 oscillator |
igorsk | 0:12b53511e212 | 352 | |
igorsk | 0:12b53511e212 | 353 | do // wait in loop until crystal is stable |
igorsk | 0:12b53511e212 | 354 | IFG1 &= ~OFIFG; |
igorsk | 0:12b53511e212 | 355 | while (IFG1 & OFIFG); |
igorsk | 0:12b53511e212 | 356 | |
igorsk | 0:12b53511e212 | 357 | BCSCTL1 |= DIVA0; // ACLK = XT1 / 2 |
igorsk | 0:12b53511e212 | 358 | BCSCTL1 &= ~DIVA1; |
igorsk | 0:12b53511e212 | 359 | |
igorsk | 0:12b53511e212 | 360 | IE1 &= ~WDTIE; // disable WDT int. |
igorsk | 0:12b53511e212 | 361 | IFG1 &= ~WDTIFG; // clear WDT int. flag |
igorsk | 0:12b53511e212 | 362 | |
igorsk | 0:12b53511e212 | 363 | WDTCTL = WDTPW | WDTTMSEL | WDTCNTCL | WDTSSEL | WDTIS1; // use WDT as timer, flag each |
igorsk | 0:12b53511e212 | 364 | // 512 pulses from ACLK |
igorsk | 0:12b53511e212 | 365 | |
igorsk | 0:12b53511e212 | 366 | while (!(IFG1 & WDTIFG)); // count 1024 pulses from XT1 (until XT1's |
igorsk | 0:12b53511e212 | 367 | // amplitude is OK) |
igorsk | 0:12b53511e212 | 368 | |
igorsk | 0:12b53511e212 | 369 | IFG1 &= ~OFIFG; // clear osc. fault int. flag |
igorsk | 0:12b53511e212 | 370 | BCSCTL2 = SELM0 | SELM1; // set XT1 as MCLK |
igorsk | 0:12b53511e212 | 371 | } |
igorsk | 0:12b53511e212 | 372 | |
igorsk | 0:12b53511e212 | 373 | void InitPorts(void) |
igorsk | 0:12b53511e212 | 374 | { |
igorsk | 0:12b53511e212 | 375 | P1SEL = 0; // switch all unused ports to output |
igorsk | 0:12b53511e212 | 376 | P1OUT = 0; // (rem.: ports 3 & 5 are set in "cs8900.c") |
igorsk | 0:12b53511e212 | 377 | P1DIR = 0xFF; |
igorsk | 0:12b53511e212 | 378 | |
igorsk | 0:12b53511e212 | 379 | P2SEL = 0; |
igorsk | 0:12b53511e212 | 380 | P2OUT = 0; |
igorsk | 0:12b53511e212 | 381 | P2DIR = 0xFF; |
igorsk | 0:12b53511e212 | 382 | |
igorsk | 0:12b53511e212 | 383 | P4SEL = 0; |
igorsk | 0:12b53511e212 | 384 | P4OUT = 0; |
igorsk | 0:12b53511e212 | 385 | P4DIR = 0xFF; |
igorsk | 0:12b53511e212 | 386 | |
igorsk | 0:12b53511e212 | 387 | P6SEL = 0x80; // use P6.7 for the ADC module |
igorsk | 0:12b53511e212 | 388 | P6OUT = 0; |
igorsk | 0:12b53511e212 | 389 | P6DIR = 0x7F; // all output except P6.7 |
igorsk | 0:12b53511e212 | 390 | } |
igorsk | 0:12b53511e212 | 391 | |
igorsk | 0:12b53511e212 | 392 | */ |