Сделана настройка уровня отладочной информации в stdout - по умолчанию программа...
[weathermon.git] / web / image.php
index 2a2d2f395415114b0e24efbce8f01c6f6c1980ff..bf511f2d03bdf2dff3e66bf39dd6cfc437559498 100644 (file)
@@ -16,6 +16,15 @@ if (! ($db = new PDO("mysql:host=$mysql_host;port=$mysql_port;dbname=$mysql_sche
 
 }  
 
+$supported = imagetypes();
+if( $supported & IMG_PNG )    $img_format="png";
+elseif( $supported & IMG_GIF ) $img_format="gif";
+elseif( $supported & IMG_JPG ) $img_format="jpeg";
+elseif( $supported & IMG_WBMP ) $img_format="wbmp";
+elseif( $supported & IMG_XPM ) $img_format="xpm";
+
+$cachefilename = NULL;
+
 $db -> exec('SET CHARACTER SET utf8');
   
 $type = $_REQUEST['type'];
@@ -73,19 +82,63 @@ if ($type and $param) {
       'select unix_timestamp(timestamp) as x,unitconv(value,'.$from_unit.','.$to_unit.') as y from sensor_values where timestamp>adddate(now(), -1) and sensor_id='.$sensor.' and parameter_id='.$param.' order by timestamp'
     );
 
-    $height = 130;
+    $bottomheight = 130;
+    $topheight = 40;
+    $sizex = 1000;
+    $sizey = 800;
+    $scale = True;
+    
+  } elseif ($type == 'last24small') {
+
+    $q = $db -> prepare(
+      'select unix_timestamp(timestamp) as x,unitconv(value,'.$from_unit.','.$to_unit.') as y from sensor_values where timestamp>adddate(now(), -1) and sensor_id='.$sensor.' and parameter_id='.$param.' order by timestamp'
+    );
+
+    $bottomheight = 20;
+    $topheight = 20;
+    $sizex = 400;
+    $sizey = 300;
+    $scale = False;
     
   } elseif ($type == 'range') {
 
+    $curr = intval(date('YmdHis'));
+
     $from = intval($_REQUEST['fromdate']);
     $to = intval($_REQUEST['todate']);
 
+    if ($curr>$to) {
+    
+        $cachefilename='meteo.'.$sensor.'.'.$param.'.'.$to_unit.'.'.$from.'-'.$to.'.'.$img_format;
+    
+    }
+
     $q = $db -> prepare(
       'select unix_timestamp(timestamp) as x,unitconv(value,'.$from_unit.','.$to_unit.') as y from sensor_values where timestamp>=str_to_date("'.$from.'","%Y%m%d%H%i%s") and timestamp<=str_to_date("'.$to.'","%Y%m%d%H%i%s") and sensor_id='.$sensor.' and parameter_id='.$param.' order by timestamp'
     );
   
-    $height = 60;
+    $bottomheight = 60;
+    $topheight = 40;
+    $sizex = 1000;
+    $sizey = 800;
+    $scale = True;
+  
+  }
+
+  $g = new Graph($sizex,$sizey);
+  
+  if ($cachefilename) {
+      if ($g->cache->IsValid($cachefilename)) {
+  
+          $g->cache->StreamImgFile($g->img,$cachefilename);
+          return;
   
+      } else {
+      
+          $timeout = 8640000;
+          $g->SetupCache($cachefilename,$timeout);
+      
+      }
   }
 
   $q -> execute();
@@ -102,7 +155,7 @@ if ($type and $param) {
 
     $total_weight=0;
     $sum=0;
-    $maxdelta = 900;
+    $maxdelta = 1800;
     
     for ($j = $i; $j < count($xdata); ++$j) {
     
@@ -132,37 +185,53 @@ if ($type and $param) {
   }
 
   // Create the graph
-  $g = new Graph(640,480);
   $g->graph_theme = null;
 
-  //$g->img->SetAntiAliasing();
+  $g->img->SetAntiAliasing();
 
-  // We need a linlin scale since we provide both
-  // x and y coordinates for the data points.
+  // We need a datlin scale since we provide both
+  // x and y coordinates for the data points, but x is unix timestamp.
   $g->SetScale('datlin');
-  $g->xaxis->SetLabelAngle(90);
+  if ($scale) {
+    $g->xaxis->SetLabelAngle(90);
+  } else {
+    $g->xaxis->HideLabels(True);
+  }
   $g->xaxis->SetPos("min");
+#  $g->xaxis->scale->SetTimeAlign( HOURADJ_1 );
+
 
-  // We use a scatterplot to illustrate the original
-  // contro points.
-  $splot = new ScatterPlot($ydata,$xdata);
-  $g->Add($splot);
+  if ($type!="last24small") {
 
-  // 
-  $splot->mark->SetFillColor($dot_color);
-  $splot->mark->SetColor($dot_color);
-  $splot->mark->SetType(MARK_FILLEDCIRCLE);
-  $splot->mark->SetSize(2);
+    // We use a scatterplot to illustrate the original
+    // contro points.
+    $splot = new ScatterPlot($ydata,$xdata);
+    $g->Add($splot);
+
+    // 
+    $splot->mark->SetFillColor($dot_color);
+    $splot->mark->SetColor($dot_color);
+    $splot->mark->SetType(MARK_FILLEDCIRCLE);
+    $splot->mark->SetSize(2);
+
+  }
 
   $fplot = new LinePlot($f_ydata,$xdata);
   $g->Add($fplot);
   $fplot->SetColor($line_color);
   $fplot->SetWeight(2);
 
-  $g->SetMargin(50,30,40,$height);
-  $g->title->Set($sensor_name.'/'.$param_name.', '.$param_unit);
-  $g->title->SetFont(FF_DV_SANSSERIF,FS_BOLD,12);
-  $g->SetMarginColor('silver');
+  $g->SetMargin(50,30,$topheight,$bottomheight);
+  if ($scale) {
+    $g->title->Set($sensor_name.'/'.$param_name.', '.$param_unit);
+    $g->title->SetFont(FF_DV_SANSSERIF,FS_BOLD,12);
+  }  
+  $g->SetMarginColor('lightgray');
+
+  $g->xgrid->Show();
+  $g->xgrid->SetLineStyle('dotted');
+  $g->ygrid->Show();
+  $g->ygrid->SetLineStyle('dotted');
 
   // Add the plots to the graph and stroke
   $g->Stroke();