# TNET Services, Inc. # Copyright: (c) 1992-2008 Copyright TNET Services, Inc. # # License: # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, # USA. # ############################################################################ # HISTORY ############################################################################ # # 1.0 Released Oct 4th 2008 # Initial Release # # 1.1 Released Oct 5th 2008 # Added TTF Support # Added Check for Rain and if none output No Rain Today # # 1.2 Released Oct 5th 2008 # Corrected ISO Date format, was missing the 20 to make the year # a 4 digit value. Realtime.txt data has it as a 2 digit year # value. # # 1.3 Released Oct 6th 2008 # Added new field $SITE['dateiso'] If yes, the date is formated # in ISO format (YYYY-MM-DD), else it will use a worded month # Date (Oct 6 2008) # # 1.4 Released Oct 8th 2008 # Increased the default size of the Cumulus Version Date line to # make it more readable. # # 2.0 Released Oct 9th 2008 # Reconfigured to use new write functions that provide right, left # center to position the text more accurately # # 3.0 Released Oct 19th, 2008 # Reconfigured to use extended realtime.txt format that was # Released with Cumulus 1.8.2 Beta. # ############################################################################ # This document uses Tab 4 Settings ############################################################################ $DATA = array(); $SITE = array(); ############################################################################ # CONFIGURATION INFORMATION ############################################################################ $SITE['version'] = "3.0"; $SITE['hloc'] = "./"; $SITE['datafile'] = "realtime.txt"; $SITE['image_width'] = 468; $SITE['image_height'] = 60; #--------------------------------------------------------------------------- $SITE['fontdir'] = "./"; # must contain ttf font files! $SITE['usettf'] = "yes"; # Set to No to use default fonts #--------------------------------------------------------------------------- $SITE['format'] = "png"; # Options: jpeg gif png $SITE['dateiso'] = "no"; $SITE['sitename'] = "Chartham Weather"; #--------------------------------------------------------------------------- // Current field names (matches tag fields) used $SITE['cvalues'] = array( "date","time","temp","hum","dew","wspeed","wgust","avgbearing","rrate", "rfall","press","wdir","beaufort","windunit","tempunit","pressunit","rainunit", "windrun","presstrend","rmonth","ryear","rfallY","intemp","inhum","wchill", "temptrendval","tempTH","TtempTH","tempTL","TtempTL", "windTM","TwindTM","wgustTM","TwgustTM", "pressTH","TpressTH","pressTL","TpressTL", "cversion","cbuild"); ############################################################################ ############################################################################ # SOURCECODE VIEW ############################################################################ if ( isset($_REQUEST['view']) && $_REQUEST['view'] == 'sce' ) { $filenameReal = __FILE__; $download_size = filesize($filenameReal); header('Pragma: public'); header('Cache-Control: private'); header('Cache-Control: no-cache, must-revalidate'); header("Content-type: text/plain"); header("Accept-Ranges: bytes"); header("Content-Length: $download_size"); header('Connection: close'); readfile($filenameReal); exit; } ############################################################################ # Reference: Cumulus Format of realtime.txt file ############################################################################ # Field Pos Example Description # date 0 18/10/08 date (always dd/mm/yy) # time 1 16:03:45 time (always hh:mm:ss) # temp 2 8.4 outside temperature # hum 3 84 relative humidity # dew 4 5.8 dewpoint # wspeed 5 24.2 wind speed (average) # wgust 6 33.0 wind speed (gust) # avgbearing 7 261 wind bearing # rrate 8 0.0 current rain rate # rfall 9 1.0 rain today # press 10 999.7 barometer # wdir 11 W wind direction # beaufort 12 6 wind speed (beaufort) # windunit 13 mph wind units # tempunit 14 C temperature units # pressunit 15 mb pressure units # rainunit 16 mm rain units # windrun 17 146.6 wind run (today) # pressrend 18 +0.1 pressure trend value # rmonth 19 85.2 monthly rain # ryear 20 588.4 yearly rain # rfallY 21 11.6 yesterday's rainfall # intemp 22 20.3 inside temperature # inhum 23 57 inside humidity # wchll 24 3.6 wind chill # temptrendval 25 -0.7 temperature trend value # tempTH 26 10.9 today's high temp # TtempTH 27 12:00 time of today's high temp (hh:mm) # tempTL 28 7.8 today's low temp # TtempTL 29 14:41 time of today's low temp (hh:mm) # windTM 30 37.4 today's high wind speed (average) # TwindTM 31 14:38 time of today's hi wind (avg) (hh:mm) # wgustTM 32 44.0 today's high wind gust # TwgustTM 33 14:28 time of today's high wind gust (hh:mm) # pressTH 34 999.8 today's high pressure # TpressTH 35 16:01 time of today's high pressure (hh:mm) # pressTL 36 998.4 today's low pressure # TpressTL 37 12:06 time of today's low pressure (hh:mm) # cversion 38 1.8.2 Cumulus version # cbuild 39 459 Cumulus build no ############################################################################ // Path to our font file $font1 = $SITE['fontdir'] . "arialbd.ttf"; $font2 = $SITE['fontdir'] . "arial.ttf"; $font3 = $SITE['fontdir'] . "verdana.ttf"; // Read data into array $DATA = get_raw($SITE['hloc'] . $SITE['datafile'],' '); $months = array ("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug", "Sep","Oct","Nov","Dec"); if ( $SITE['dateiso'] == "yes" ) { // Fix date to use ISO formatted date $DATA[0] = "20" . substr($DATA[0],6,2) . '-' . substr($DATA[0],3,2) . '-' . substr($DATA[0],0,2); } else { // Fix date to use Month formatted date $DATA[0] = $months[intval(substr($DATA[0],3,2)) -1 ] . " " . intval(substr($DATA[0],0,2)) . " " . "20" . substr($DATA[0],6,2); } // Fix time by removing seconds from the field $DATA[1] = substr($DATA[1],0,5); // Output the header to let the browser know we are // sending a graphic file format header("Content-type: image/" . $SITE['format'] ); $im = @imagecreate($SITE['image_width'], $SITE['image_height']) or die("Cannot Initialize new GD image stream"); // Set colors we want to use... // first background is a white background $background_color = imagecolorallocate($im, 0xFF, 0xFF, 0xFF); $black = imagecolorallocate($im, 0x00, 0x00, 0x00); $green = imagecolorallocate($im, 0x00, 0x80, 0x00); $blue = imagecolorallocate($im, 0x00, 0x00, 0xff); $red = imagecolorallocate($im, 0xff, 0x00, 0x00); // Make a Border Around the box ImageRectangle($im, 0, 0, $SITE['image_width'] -1 , $SITE['image_height'] -1, $black); // Print Station Name $text = $SITE['sitename']; if ($SITE['usettf'] == "yes" ) { $size = 11; imagettftextbox($im, $size, 0, 0, 4, $green, $font1, $text, $SITE['image_width'], "left"); } else { $size = 5; imageWriteString($im, $size, $text, $green, "left", 3); } // Print Date (top right corner) $text = ret_value("date") . ' @ ' . ret_value("time"); if ($SITE['usettf'] == "yes" ) { $size = 8; imagettftextbox($im, $size, 0, 0, 1, $green, $font3, $text, $SITE['image_width'], "right"); } else { $size = 2; imageWriteString($im, $size, $text, $green, "right", 1); } // Print Cumulus version info $text = "Cumulus v" . ret_value("cversion") . ' #' . ret_value("cbuild"); if ($SITE['usettf'] == "yes" ) { $size = 6; imagettftextbox($im, $size, 0, 0, 14, $green, $font3, $text, $SITE['image_width'], "right"); } else { $size = 2; imageWriteString($im, $size, $text, $green, "right", 11); } // Print Temp $text = ret_value("temp") . '' . ret_value("tempunit"); if ($SITE['usettf'] == "yes" ) { $size = 18; imagettftextbox($im, $size, 0, 0, 20, $red, $font1, $text, $SITE['image_width'], "center"); } else { $size = 5; imageWriteString($im, $size, $text, $red, "center", 23); } // Print Humitidy and Dewpt Centered $text = "Hum: " . ret_value("hum") . "% - " . "DewPt: " . ret_value("dew") . '' . ret_value("tempunit"); if ($SITE['usettf'] == "yes" ) { $size = 10; imagettftextbox($im, $size, 0, 0, 41, $black, $font2, $text, $SITE['image_width'], "center"); } else { $size = 3; imageWriteString($im, $size, $text, $black, "center", 40); } // Print windspeed $text = "Wind: " . ret_value("wdir") . " @ " . ret_value("wspeed") . ret_value("windunit"); if ($SITE['usettf'] == "yes" ) { $size = 10; imagettftextbox($im, $size, 0, 0, 22, $black, $font3, $text, $SITE['image_width'], "left"); } else { $size = 5; imageWriteString($im, $size, $text, $black, "left", 23); } // Print Wind gust $text = "Gust: " . ret_value("wgust") . ret_value("windunit"); if ($SITE['usettf'] == "yes" ) { $size = 8; imagettftextbox($im, $size, 0, 0, 40, $black, $font2, $text, $SITE['image_width'], "left"); } else { $size = 2; imageWriteString($im, $size, $text, $black, "left", 39); } // Print Rain if (ret_value("rfall") == "0.00" ) { $text = "No Rain Today"; $py = 22; } else { $text = " Rain: " . ret_value("rfall") . ' ' . ret_value("rainunit"); $py = 25; } if ($SITE['usettf'] == "yes" ) { $size = 10; imagettftextbox($im, $size, 0, 0, $py, $blue, $font3, $text, $SITE['image_width'], "right"); } else { $size = 5; imageWriteString($im, $size, $text, $blue, "right", 23); } // Print Baro $text = "Baro: " . ret_value("press") . ' ' . ret_value("pressunit"); if ($SITE['usettf'] == "yes" ) { $size = 8; imagettftextbox($im, $size, 0, 0, 42, $black, $font2, $text, $SITE['image_width'], "right"); } else { $size = 2; imageWriteString($im, $size, $text, $black, "right", 39); } // Output the image in the format we are // setup. if ($SITE['format'] == "png" ) { imagepng($im); } if ($SITE['format'] == "jpeg" ) { imagejpeg($im); } if ($SITE['format'] == "gif" ) { imagegif($im); } // We be done... destroy the image imagedestroy($im); exit; ############################################################################ # FUNCTIONS ############################################################################ // Function to read the data file with the // Delimiter provided function get_raw( $rawfile , $del ) { $rawdata = array(); $fd = fopen( $rawfile, "r" ); if ( $fd ) { $rawinfo = ''; while (! feof ( $fd ) ) { $rawinfo .= fread( $fd, 8192 ); } fclose($fd); $rawdata = explode ( $del, $rawinfo ); } else { $rawdata[0]= -9999; } return $rawdata; } // function outputs a string centered in the image function center_text ( $image, $size, $string, $y, $color) { $px = ((imagesx($image)/2) - ( ImageFontWidth($size) * strlen($string) ) / 2); imagestring($image, $size, $px, $y,$string, $color); } // Function snarfed off of a PHP forum. User sk89q function imagettftextbox(&$image, $size, $angle, $left, $top, $color, $font, $text, $max_width, $align) { $text_lines = explode("\n", $text); // Supports line breaks! $lines = array(); $line_widths = array(); $largest_line_height = 0; foreach($text_lines as $block) { $current_line = ''; // Reset current line $words = explode(' ', $block); // Split the text array of single words $first_word = TRUE; $last_width = 0; for($i = 0; $i < count($words); $i++) { $item = $words[$i]; $dimensions = imagettfbbox($size, $angle, $font, $current_line . ($first_word ? '' : ' ') . $item); $line_width = $dimensions[2] - $dimensions[0]; $line_height = $dimensions[1] - $dimensions[7]; if($line_height > $largest_line_height) $largest_line_height = $line_height; if($line_width > $max_width && !$first_word) { $lines[] = $current_line; $line_widths[] = $last_width ? $last_width : $line_width; /*if($i == count($words)) { continue; }*/ $current_line = $item; } else { $current_line .= ($first_word ? '' : ' ') . $item; } if($i == count($words) - 1) { $lines[] = $current_line; $line_widths[] = $line_width; } $last_width = $line_width; $first_word = FALSE; } if($current_line) { $current_line = $item; } } $i = 0; foreach($lines as $line) { if($align == "center") { $left_offset = ($max_width - $line_widths[$i]) / 2; } elseif($align == "right") { $left_offset = ($max_width - $line_widths[$i] - 6); } if ($align == "left") { $left_offset = 5; } imagettftext($image, $size, $angle, $left + $left_offset, $top + $largest_line_height + ($largest_line_height * $i), $color, $font, $line); $i++; } return $largest_line_height * count($lines); } // Similar function for use with standard GD fonts. function imageWriteString(&$img, $font, $text, $color, $position_x = 'center', $position_y = 'center') { // initialize internal variables $x = null; $y = null; if($font < 0 || $font > 5){ $font = 0; } $num = array(array(4.6, 6), array(4.6, 6), array(5.6, 12), array(6.5, 12), array(7.6, 16), array(8.5, 16)); $width = ceil(strlen($text) * $num[$font][0]); $height = $num[$font][1] + 2; // handle position x if (is_string($position_x)) { switch($position_x) { case 'left': $position_x = 5; break; case 'right': $position_x = -8; break; default: case 'center': $x = (imagesx($img) - $width - 8) / 2; break; } } if (!isset($x)) { if(is_numeric($position_x)) { if ($position_x >= 0) { $x = $position_x; // left } else { $x = imagesx($img) - $width + $position_x - 8; // right } } else { $x = (imagesx($img) - $width - 8) / 2; // default / error value: center } } // handle position y if (is_string($position_y)) { switch($position_y) { case 'top': $position_y = 5; break; case 'bottom': $position_y = -5; break; default: case 'center': $y = (Imagesy($img) - ($num[$font][1] + 2))/2; break; } } if (!isset($y)) { if (is_numeric($position_y)) { if ($position_y >= 0) { $y = $position_y; // top } else { $y = Imagesy($img) - $height + $position_y; // bottom } } else { $y = (Imagesy($img) - ($num[$font][1] + 2))/2; // default / error value: center } } imagestring($img, $font, $x, $y, $text, $color); } function ret_value($lookup) { global $SITE, $DATA; $rtn = array_search ( $lookup , $SITE['cvalues'] ); if ($rtn !== FALSE) { return( $DATA[$rtn] ); } else { return("-"); } } ############################################################################ # END OF MODULES ############################################################################