📄 http.lst
字号:
205 1 // we need to re-generate page
206 1 // TODO: if post, then save switch state infomation
207 1 if (!resend)
208 1 {
209 2 tcp_data = inbuf + 34 + header_len;
210 2 memcpy(conxn[nr].query, tcp_data, 20);
211 2 conxn[nr].old_sequence = conxn[nr].my_sequence;
212 2 }
213 1 // If this is a resend, set sequence number to what it was
214 1 // the last time we sent this
215 1 else
216 1 {
217 2 tcp_data = inbuf;
218 2 conxn[nr].my_sequence = conxn[nr].old_sequence;
219 2 }
220 1
221 1 // Start off with no request
222 1 request = NONE;
223 1
224 1 // TODO: Calling strstr() on a large buffer takes a lot of time
225 1 // so perhaps we could speed things up by limiting the search
226 1 // range to the portion of the buffer where the item is expected
227 1 // to be found
228 1
229 1 // If it is a POST, then set a flag to start looking for the post
230 1 // data of interest, which is the string "switch=". It may arrive
231 1 // in a later segment (Netscape seems to split up the POST message)
232 1 if (strstr(tcp_data, "POST") != NULL) post_flg = TRUE;
233 1
234 1 // See if this is a GET message
235 1 else if (strstr(tcp_data, "GET") != NULL)
236 1 {
237 2 post_flg = FALSE;
238 2 if (strstr(tcp_data, "photo1") != NULL) request = GET_JPEG;
239 2 else if (strstr(tcp_data, "index") != NULL) request = GET_PAGE;
240 2 else if (strstr(tcp_data, "/ ") != NULL) request = GET_PAGE;
241 2 }
C51 COMPILER V7.50 HTTP 08/03/2006 09:34:43 PAGE 5
242 1
243 1 // If POST flag is "armed" then look for the "switch=" string
244 1 // and if found, turn the LED on or off according to whether
245 1 // the browser is sending a 1 or a 0.
246 1 if (post_flg)
247 1 {
248 2 ptr = strstr(tcp_data, "switch=");
249 2 if (ptr != NULL)
250 2 {
251 3 // Move to space after equals sign
252 3 // Set control indicator accordingly
253 3 post_flg = FALSE;
254 3 request = POST_PAGE;
255 3 ptr += 7;
256 3 if (*ptr == '1') {CONTROL_LED=0x0;}
257 3 else if (*ptr == '0') {CONTROL_LED=0x1;}
258 3 LightONOFF(CONTROL_LED);
259 3 P36=CONTROL_LED;
260 3 }
261 2 }
262 1
263 1 if ((request == GET_PAGE) || (request == POST_PAGE))
264 1 {
265 2 // Figure out sizes
266 2 hhdr_len = strlen(html_header);
267 2 page_len = strlen(web_page);
268 2 body_len = hhdr_len + page_len;
269 2
270 2 // Free memory holding received message. The message from the
271 2 // browser can be 500+ bytes long so this is a significant
272 2 // chunk out of the available malloc space of 1500 bytes
273 2 if (!resend) { rcve_buf_allocated = FALSE;}
274 2
275 2 // Allocate memory for entire outgoing message including
276 2 // 14 byte Ethernet + 20 byte IP + 20 byte TCP headers
277 2 // Allow 1 byte for NULL char at the end
278 2 // outbuf = (UCHAR xdata *)malloc(54 + body_len + 1);
279 2 // if (outbuf == NULL)
280 2 //{
281 2 // return 0;
282 2 //}
283 2 outbuf = outbuf1;
284 2 // Copy page data. This moves data from flash into RAM. It is
285 2 // an undesirable process, but must get data into RAM to replace
286 2 // tags
287 2 memcpy(outbuf + 54, html_header, hhdr_len);
288 2 memcpy(outbuf + 54 + hhdr_len, web_page, page_len);
289 2
290 2 outbuf[54 + body_len] = 0; // Append NULL
291 2
292 2 // Replace length tag with actual value
293 2 itoa(page_len, text, 10);
294 2 replace_tag(outbuf + 54, "TAG:LEN1", text);
295 2
296 2 // Replace CPU temperature tag with actual value
297 2 itoa(cpu_temperature/100, text, 10);
298 2 i=strlen(text);
299 2 text[i]='.';
300 2 i++;
301 2 itoa(cpu_temperature%100, text+i, 10);
302 2 replace_tag(outbuf + 54, "TAG:TMP1", text);
303 2
C51 COMPILER V7.50 HTTP 08/03/2006 09:34:43 PAGE 6
304 2 itoa(air_temperature/1000, text, 10);
305 2 i=strlen(text);
306 2 text[i]='.';
307 2 i++;
308 2 itoa(air_temperature%1000, text+i, 10);
309 2 replace_tag(outbuf + 54, "TAG:TMP2", text);
310 2
311 2 // Replace CPU voltage tag with actual value X 100
312 2 // Insert decimal point between first and second digits
313 2 itoa(cpu_voltage/1000, text, 10);
314 2 i=strlen(text);
315 2 text[i]='.';
316 2 i++;
317 2 itoa(cpu_voltage%1000, text+i, 10);
318 2 replace_tag(outbuf + 54, "TAG:VOL1", text);
319 2
320 2 // Insert the word CHECKED into the html so the browser will
321 2 // check the correct LED state indicator box
322 2 if (CONTROL_LED == OFF) replace_tag(outbuf + 54, "TAG:CHK1", "CHECKED");
323 2 else replace_tag(outbuf + 54, "TAG:CHK2", "CHECKED");
324 2
325 2 // Segment length = body_len + 20
326 2 http_send(outbuf, body_len + 20, nr);
327 2 conxn[nr].my_sequence += body_len;
328 2 }
329 1 else if (request == GET_JPEG)
330 1 {
331 2 // Ths browser has requested the jpeg image. First figure out
332 2 // sizes - cannot use sizeof() for jpeg here because it is in
333 2 // another module. Just directly specify length of it
334 2 jhdr_len = strlen(jpeg_header);
335 2 jpeg_len = 5705;//6194;
336 2 body_len = jhdr_len + jpeg_len;
337 2
338 2 // Free memory holding received message. The message from the
339 2 // browser can be 500+ bytes long so this is a significant
340 2 // chunk out of the available malloc space of 1500 bytes
341 2 if (!resend) { rcve_buf_allocated = FALSE;}
342 2
343 2 // First send the header and enough of the jpeg to make 1000 bytes.
344 2 // The value of 1000 is arbitrary, but must be stay under 1500.
345 2 if (body_len < 1000) remaining = body_len; else remaining = 1000;
346 2 // outbuf = (UCHAR xdata *)malloc(54 + remaining + 1);
347 2 //if (outbuf == NULL)
348 2 //{
349 2 // return 0;
350 2 //}
351 2 outbuf=outbuf1;
352 2 memcpy(outbuf + 54, jpeg_header, jhdr_len);
353 2 memcpy(outbuf + 54 + jhdr_len, photo1_jpeg, remaining - jhdr_len);
354 2
355 2 outbuf[54 + remaining] = 0; // Append NULL
356 2
357 2 // Replace jpeg length tag with actual value
358 2 itoa(jpeg_len, text, 10);
359 2 replace_tag(outbuf + 54, "TAG:LEN2", text);
360 2
361 2 http_send(outbuf, remaining + 20, nr);
362 2 sent = remaining - jhdr_len;
363 2 conxn[nr].my_sequence += remaining;
364 2
365 2 // Send the rest of the jpeg file in 1000 byte chunks. This sends about
C51 COMPILER V7.50 HTTP 08/03/2006 09:34:43 PAGE 7
366 2 // 6 segments of 1000 bytes back to back, but we should actually process
367 2 // acks from the other end to make sure we are not sending more than the
368 2 // other end can receive. Most systems can handle 6K
369 2 while (sent < jpeg_len)
370 2 {
371 3 remaining = jpeg_len - sent;
372 3 if (remaining > 1000) remaining = 1000;
373 3 // outbuf = (UCHAR xdata *)malloc(54 + remaining + 1);
374 3 outbuf=outbuf1;
375 3 // if (outbuf == NULL)
376 3 //{
377 3 // return 0;
378 3 //}
379 3
380 3 memcpy(outbuf + 54, photo1_jpeg + sent, remaining);
381 3
382 3 outbuf[54 + remaining] = 0; // Append NULL
383 3 http_send(outbuf, remaining + 20, nr);
384 3 sent += remaining;
385 3 conxn[nr].my_sequence += remaining;
386 3 }
387 2 }
388 1 else
389 1 {
390 2 // The incoming HTTP message did not warrant a response
391 2 return 0;
392 2 }
393 1
394 1 // Return number of bytes sent, not including TCP header
395 1 return(body_len);
396 1 }
397
398
399
400
401
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 2378 ----
CONSTANT SIZE = 104 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 53
IDATA SIZE = 1 23
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -