Mercurial > ~darius > hgwebdir.cgi > wh1080
diff wh1080.h @ 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/wh1080.h Tue Feb 09 13:44:25 2010 +1030 @@ -0,0 +1,187 @@ +/* + * WH-1080 data input utility. + * + * Greg Lehey, 16 November 2009 + * + * $Id: wh1080.h,v 1.9 2010/02/07 03:41:07 grog Exp $ + */ + +#include <errno.h> +#include <stdio.h> +#include <math.h> +#include <sys/file.h> +#include <sys/stat.h> +#include <sys/param.h> +#include <stdint.h> +#include <string.h> +#include <unistd.h> +#include <usb.h> +#include <mysql/mysql.h> +#include <sys/mman.h> +#include <pwd.h> + +/* Station description */ +#include "wh1080_dev.h" + +/* Program-dependent stuff. */ +#define WH1080_MAX_RETRIES 5 +#define WH1080_READ_TIMEOUT 1000 +#define WH1080_WRITE_TIMEOUT 1000 + +#define STAMPSIZE 32 /* size of time stamp to print out */ +#define DATETEXTLENGTH 48 /* more than maximum size of date text */ +#define SECSPERHOUR 3600 /* seconds per hour */ +#define SECSPERDAY 86400 /* and seconds per day */ + +/* Conversion factors to archaic units, for Wunderground and friends */ +#define KM_TO_MILES 0.6213711922 +#define MM_TO_IN 0.039370078 +#define C_TO_F(C) (C * 1.8 + 32) +#define hPa_TO_inHg 0.0295299801 +/* + * For some reason, Wunderground doesn't adhere to this constant. By + * observation, the constant must be something like this. + * + * 29.87 / 1011.4 = 0.029533320 + * 29.88 / 1011.7 = 0.029534446 + * 29.89 / 1012.1 = 0.029532654 + * 29.90 / 1012.4 = 0.029533781 + * Average 0.02953553 + * + */ +#define Wunder_hPa_TO_inHg 0.02953553 + + +/* OK, this one's not so archaic */ +#define KELVIN(C) (C + 273.15) + +struct usb_dev_handle { + int fd; + + struct usb_bus *bus; + struct usb_device *device; + + int config; + int interface; + int altsetting; + + /* Added by RMT so implementations can store other per-open-device data */ + int *impl_info; +}; + +/* + * Local configuration, to be read from configuration file. + * If this changes, also change the table definition in db/mkdb. + */ +struct config +{ + int version; /* format version, for DB */ +#define CONFIG_VERSION 1 /* current format version */ + float latitude; /* In ° */ + float longitude; + float elevation; /* metres */ + float pressure_error; /* difference between actual and real pressure, hPa */ + int poll_interval; /* time, in seconds, between reading the device */ + char *station_id; /* this is the one we use for the database */ + char *address; /* Address to display on web pages */ + char *wunderground_station_id; + char *wunderground_passwd; + int wunderground_report_interval; /* how many seconds between reports to Wunderground */ + char *weatheforyou_station_id; + char *weatheforyou_passwd; + int weatherforyou_report_interval; /* how many seconds between reports to Weather for you */ + int website_generation_interval; /* how many seconds between generating PHP header file */ + char *db_host; /* database on this host */ + char *db_user; /* user ID on host */ + char *db_passwd; /* and password */ + char *db; /* database name */ + char *db_table; /* table */ + char *php_header; /* php header file with weather data */ + char *comparefile; /* file to compare local weather stations */ +}; + +extern struct config config; +/* Command line options, defined in db.c */ +extern int debug; /* -d */ +extern int update; /* -n turns updating off */ +extern int recover; /* -r: recover missed archive data (wh1080 only) */ +extern int verbose; /* -v */ +extern int once; /* -1 */ + +/* MySQL stuff */ +extern MYSQL *mysql; +extern MYSQL_RES *mysql_result; +extern MYSQL_ROW mysql_row; +extern char mysql_querytext [1024]; /* build up queries here */ + + +/* + * Readings in sanitized form. These are effectively the readings from the + * station in a format that's easier for us to use. + */ + +struct readings +{ + int page; /* page from whence the readings came */ + time_t timestamp; /* time of reading */ + int last_save_mins; /* last save minutes (?) */ + float inside_temp; /* inside temperature */ + int inside_humidity; /* humidity in percent */ + float inside_dewpoint; /* dewpoint temperature inside */ + float outside_temp; /* outside temperature */ + int outside_humidity; /* humidity in percent */ + float outside_dewpoint; /* dewpoint temperature outside */ + float pressure; /* absolute pressure, hPa */ + float pressure_sea_level; /* relative sea level pressure, hPa */ + float page1_abs_pressure; /* absolute pressure, hPa, from page 1 */ + float page1_rel_pressure; /* relative pressure, hPa, from page 1 */ + float wind_speed; /* wind speed in km/h */ + float wind_gust; /* wind gust speed in km/h */ + float wind_direction; /* wind direction, as angle */ +#define INVALID_DIRECTION 1024 /* set if we get invalid readings */ + char wind_direction_text [4]; /* wind direction, in text */ + /* + * We keep two rain counters. rain is the current rainfall, incremented on + * every reading. This is similar to, but not the same as, what the station + * does internally. This field is only changed by the wh1080 program. + * + * The other field, 'previous_rain', is set to 'rain' by the report program + * after reporting the rainfall. It is only changed by report. This approach + * avoids any kind of locking. + */ + float rain; /* rainfall in mm */ + float previous_rain; /* previous rainfall in mm */ +}; + +extern struct readings current_readings; + +struct sharefile +{ +#define SHARED_MAGIC 0x539 + int magic; /* magic number */ + struct readings current_readings; /* current readings */ +}; + +extern struct sharefile *sharefile; /* file to map */ +extern int sharefd; /* and descriptor */ +extern float print_previous_rain; + +/* MySQL stuff, in db.c */ +extern MYSQL *mysql; +extern MYSQL_RES *mysql_result; +extern MYSQL_ROW mysql_row; +extern char mysql_querytext [1024]; /* build up queries here */ +extern char *wind_directions []; /* in util.c */ + +/* in db.c */ +void db_login (); +int doquery (char *query); +int domyquery (char *query, MYSQL_RES **result); +char *mycopy (char *); +int read_config (int argc, char *argv []); + +void print_readings (struct readings *readings); +float dewpoint (float temp, int humidity); +void set_dewpoints (struct readings *readings); +void set_sea_level_pressure (struct readings *readings); +void datetext (time_t, char *, char *);