Mercurial > ~darius > hgwebdir.cgi > wh1080
diff util.c @ 0:9dab44dcb331
Initial commit of Greg's code from http://www.lemis.com/grog/tmp/wh1080.tar.gz
author | Daniel O'Connor <darius@dons.net.au> |
---|---|
date | Tue, 09 Feb 2010 13:44:25 +1030 |
parents | |
children | b22a888eb975 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/util.c Tue Feb 09 13:44:25 2010 +1030 @@ -0,0 +1,100 @@ +/* + * WH-1080 data input utility. + * Utility functions + * + * Greg Lehey, 22 November 2009 + * + * $Id: util.c,v 1.6 2009/12/18 02:13:23 grog Exp $ + */ + +#include "wh1080.h" + +/* Used in many places, but not here */ +char *wind_directions [] = {"N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", + "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW "}; + +float print_previous_rain; /* counter for print_readings */ + +/* Print out readings */ +void print_readings (struct readings *readings) +{ + static int lines = 0; + char timestamp [STAMPSIZE]; + + if (lines == 0) + printf ("\n" + " Page sv IT IH IDP OT OH ODP hPa SL abs rel Wind Gust Dir Rain CR PR \n"); + + strftime (timestamp, STAMPSIZE, "%F %T", localtime (&readings->timestamp)); /* format time and date */ + + printf ("%17s %5x %3d %5.1f %3d %5.1f %5.1f %3d %5.1f %6.1f %6.1f %6.1f %6.1f %5.1f %5.1f %3s %4.1f %4.1f %4.1f\n", + timestamp, /* current time */ + readings->page, /* machine page number */ + readings->last_save_mins, /* last save minutes (?) */ + readings->inside_temp, /* inside temperature */ + readings->inside_humidity, /* humidity in percent */ + readings->inside_dewpoint, /* inside dewpoint */ + readings->outside_temp, /* outside temperature */ + readings->outside_humidity, /* humidity in percent */ + readings->outside_dewpoint, /* outside dewpoint */ + readings->pressure, /* absolute pressure, hPa */ + readings->pressure_sea_level, /* sea level pressure, hPa */ + readings->page1_abs_pressure, /* absolute pressure, hPa */ + readings->page1_rel_pressure, /* relative pressure, hPa */ + readings->wind_speed, /* wind speed in km/h */ + readings->wind_gust, /* wind gust speed in km/h */ + readings->wind_direction_text, /* wind direction */ + readings->rain - print_previous_rain, /* delta rainfall in mm */ + readings->rain, /* current rainfall in mm */ + readings->previous_rain ); /* previous rainfall in mm */ + print_previous_rain = readings->rain; /* reported this far */ + if (++lines > 60) + lines = 0; +} + +/* + * Calculate dewpoint temperature. Replace this with something with better references. + */ +float dewpoint (float temp, int humidity) +{ + float Es; /* saturated water vapour pressure at dry-bulb temperature */ + float Ep; /* partial pressure at this humidity */ + + Es = 6.11 * pow (10.0, 7.5 * (temp / (237.7 + temp))); + Ep = (humidity * Es) / 100; + return (-430.22 + 237.7 * log (Ep)) / (-log (Ep) + 19.08); +} + +/* + * Calculate inside and outside dewpoints and store in the record. + */ +void set_dewpoints (struct readings *readings) +{ + readings->inside_dewpoint = dewpoint (readings->inside_temp, readings->inside_humidity); + readings->outside_dewpoint = dewpoint (readings->outside_temp, readings->outside_humidity); +} + +/* + * Convert pressure to sea-level pressure. The barometer is in the inside unit, + * so we use the internal temperature as a base. + */ +void set_sea_level_pressure (struct readings *readings) +{ + float e = - config.elevation / (KELVIN (readings->inside_temp) * 29.263); + + e = exp (e); + + readings->pressure_sea_level = readings->pressure / e; +} + +/* + * Simplified date conversion. + * text must be big enough for format; we don't check. + */ +void datetext (time_t date, char *text, char *format) +{ + struct tm *date_tm; /* struct tm format of date */ + + date_tm = localtime (&date); /* and in struct tm format */ + strftime (text, 64, format, date_tm); +}