WEBPART.C
上传用户:sunrenlu
上传日期:2022-06-13
资源大小:1419k
文件大小:5k
源码类别:

操作系统开发

开发平台:

DOS

  1. #include <rtos.h>
  2. #include <net.h>
  3. #include <stdio.h>
  4. #include <ctype.h>
  5. #include <string.h>
  6. #include <graph.h>
  7. #include <httpd.h>
  8. #include <emath.h>
  9. #include <strlst.h>
  10. #include <stdlib.h>
  11. #include "ldriver.h"
  12. /*-----------------------------------------------------------------------*
  13. /* Read A/D - returns the temperature in Celcius times 10                *
  14.  *-----------------------------------------------------------------------*/
  15. int GetTemperatureX10( WORD sensor )
  16. {
  17.     PutA2DChannel( sensor );
  18.     return (GetA2D() - 2732);
  19. }
  20. /*-----------------------------------------------------------------------*
  21.  * Sample Data Collector                                                 *
  22.  *                                                                       *
  23.  * This code is mostly in charge of aging the data history               *
  24.  * every 5 seconds.                                                      *
  25.  *                                                                       *
  26.  * It is placed in a separate thread so it is easy to read               *
  27.  *-----------------------------------------------------------------------*/
  28. #define SOURCES 2   /* two data sources, 0 and 1 */
  29. #define POINTS 40
  30. static int last_n_points[ SOURCES ][ POINTS ];    /* this is the series over time */
  31. crit_x *collector_cs = NULL;
  32. void collector( DWORD param )
  33. {
  34.     int i,j;
  35.     int celcius;
  36.     /* clear history */
  37.     memset( last_n_points, 0, sizeof( last_n_points ));
  38.     /* we will use a critical section so that collector and
  39.      * reporter are not interrupting each other
  40.      */
  41.     collector_cs = cs_alloc();
  42.     do {
  43.         rt_sleep( 1000 );    /* sample every second */
  44.         /* react to that collected data
  45.          * start by locking it
  46.          */
  47.         cs_enter( collector_cs );
  48.         /* remove the last one from history */
  49.         for ( j = 0 ; j < SOURCES ; ++j ) {
  50.             for ( i = 0 ; i < POINTS - 1 ; ++i )
  51.                 last_n_points[ j ][ i ] = last_n_points[ j ][ i + 1 ];
  52.         }
  53.         /* now add some new data */
  54.         for ( j = 0 ; j < SOURCES ; ++j ) {
  55.             last_n_points[ j ][ POINTS - 1 ] = GetTemperatureX10( j );
  56.         }
  57.         cs_exit( collector_cs );
  58.     } while ( 1 );
  59. }
  60. /* graph code */
  61. crit_x *graph_cs = NULL;
  62. void web_graph( tcp_Socket *s, WORD table )
  63. {
  64.     graph_x *g;
  65.     kblock();
  66.     if ( graph_cs == NULL )
  67.         graph_cs = cs_alloc();
  68.     kunblock();
  69.     if ( table > SOURCES )  table = 0;   /* or else we can point to garbage */
  70.     cs_enter( graph_cs );
  71. #define GRWIDTH 200
  72. #define GRHEIGHT 50
  73.     g = gr_alloc( GRWIDTH, GRHEIGHT);
  74.     if ( g != NULL ) {
  75.         gr_background( g, 7 );
  76.         /* put a title on the graph */
  77.         gr_text_at( g , "Celcius X 10", GRWIDTH/5, GRHEIGHT - 10, 0 );
  78.         /* we need to lock the data for this time */
  79.         cs_enter( collector_cs );
  80.         gr_linegraph( g, POINTS, last_n_points[table], NULL, NULL, 0, 1 );
  81.         /* we don't need the lock on the data anymore */
  82.         cs_exit( graph_cs );
  83.         cs_exit( collector_cs );
  84.         sock_mode( s, TCP_MODE_BINARY );
  85.         sock_mode( s, TCP_MODE_BINARY | TCP_MODE_NONAGLE );
  86.         gr_gif( s, g );     /* write the graph out as a GIF file */
  87.         gr_free( g );
  88.         return;
  89.     }
  90.     cs_exit( graph_cs );
  91. }
  92. void ShowTemperature( tcp_Socket *s, int sensor )
  93. {
  94.     int value;
  95.     int f;
  96.     char buffer[128];
  97.     value = last_n_points[ sensor ][ POINTS - 1];
  98.     f =  9*value/5 + 320;
  99.     sprintf( buffer, " %u.%u C,  %u.%u F ",
  100.             value / 10, value % 10,
  101.             f / 10, f % 10);
  102.     sock_puts( s, buffer );
  103. }
  104. void ShowProbe0( tcp_Socket *s, stringlist *cookies )
  105. {
  106.     ShowTemperature( s, 0 );
  107. }
  108. void ShowProbe1( tcp_Socket *s, stringlist *cookies )
  109. {
  110.     ShowTemperature( s, 1 );
  111. }
  112. static ssi_type ssi_list[] =
  113.   { { "probe0", ShowProbe0 },
  114.     { "probe1", ShowProbe1 },
  115.     NULL };
  116. /***********************************************************************
  117.  * - the web server calls this proc for each web request               *
  118.  * - it is called in the context of *one* of the HTTPD threads,        *
  119.  *   though which is not known or important                            *
  120.  * - multiple threads may be in the same proc at the same time         *
  121.  ***********************************************************************/
  122. void user_proc( tcp_Socket *s, char *cmd, char *file, char *ext,
  123.     stringlist *cookies )
  124. {
  125.     char *p, *q;
  126.     /* prepare output */
  127.     if ( !stricmp( ext, "gif"))  {
  128.         if ( !strnicmp( file, "/graph", 6 )) {
  129.             /* short expiry (1 sec) so it re-loads */
  130.             html_datestring( s, "Expires: content="%s"", 1);
  131.             sock_puts( s, "Content-Type: image/gifrn");
  132.             web_graph( s, file[6] - '0' );  /* index to table */
  133.         } else
  134.             http_dump( s, "web", file,ext );
  135.     } else {
  136.         /* non gif stuff */
  137.         sock_puts( s, "Content-Type: text/htmlrn");
  138.         if ( !stricmp( file, "/" ))
  139.             http_shtml( s, "web", "index","sht", ssi_list, cookies );
  140.         else if ( !stricmp( ext, "sht" ))
  141.             http_shtml( s, "web", file, ext, ssi_list, cookies );
  142.         else
  143.             http_dump( s, "web", file, ext );
  144.     }
  145. }