/* open2300 - rw2300.h * Include file for the open2300 read and write functions * including the data conversion functions * version 1.10 */ #ifndef _INCLUDE_RW2300_H_ #define _INCLUDE_RW2300_H_ #ifdef WIN32 #include "win2300.h" #endif #ifndef WIN32 #include "linux2300.h" #endif #include #include #include #include #include #include #include #include #include #define MAXRETRIES 50 #define MAXWINDRETRIES 20 #define WRITENIB 0x42 #define SETBIT 0x12 #define UNSETBIT 0x32 #define WRITEACK 0x10 #define SETACK 0x04 #define UNSETACK 0x0C #define RESET_MIN 0x01 #define RESET_MAX 0x02 #define METERS_PER_SECOND 1.0 #define KILOMETERS_PER_HOUR 3.6 #define MILES_PER_HOUR 2.23693629 #define CELCIUS 0 #define FAHRENHEIT 1 #define MILLIMETERS 1 #define INCHES 25.4 #define HECTOPASCAL 1.0 #define MILLIBARS 1.0 #define INCHES_HG 33.8638864 /* ONLY EDIT THESE IF WEATHER UNDERGROUND CHANGES URL */ #define WEATHER_UNDERGROUND_BASEURL "weatherstation.wunderground.com" #define WEATHER_UNDERGROUND_PATH "/weatherstation/updateweatherstation.php" #define WEATHER_UNDERGROUND_SOFTWARETYPE "open2300%20v" #define MAX_APRS_HOSTS 6 typedef struct { char name[50]; int port; } hostdata; struct config_type { char serial_device_name[50]; char citizen_weather_id[30]; char citizen_weather_latitude[20]; char citizen_weather_longitude[20]; hostdata aprs_host[MAX_APRS_HOSTS]; // max 6 possible aprs hosts 1 primary and 5 alternate int num_hosts; // total defined hosts char weather_underground_id[30]; char weather_underground_password[50]; char timezone[6]; //not integer because of half hour time zones double wind_speed_conv_factor; //from m/s to km/h or miles/hour int temperature_conv; //0=Celcius, 1=Fahrenheit double rain_conv_factor; //from mm to inch double pressure_conv_factor; //from hPa (=millibar) to mmHg char mysql_host[50]; //Either localhost, IP address or hostname char mysql_user[25]; char mysql_passwd[25]; char mysql_database[30]; int mysql_port; //0 works for local connection char pgsql_connect[128]; char pgsql_table[25]; char pgsql_station[25]; int modbus_port; }; struct timestamp { int minute; int hour; int day; int month; int year; }; /* Weather data functions */ double temperature_indoor(WEATHERSTATION ws2300, int temperature_conv); void temperature_indoor_minmax(WEATHERSTATION ws2300, int temperature_conv, double *temp_min, double *temp_max, struct timestamp *time_min, struct timestamp *time_max); int temperature_indoor_reset(WEATHERSTATION ws2300, char minmax); double temperature_outdoor(WEATHERSTATION ws2300, int temperature_conv); void temperature_outdoor_minmax(WEATHERSTATION ws2300, int temperature_conv, double *temp_min, double *temp_max, struct timestamp *time_min, struct timestamp *time_max); int temperature_outdoor_reset(WEATHERSTATION ws2300, char minmax); double dewpoint(WEATHERSTATION ws2300, int temperature_conv); void dewpoint_minmax(WEATHERSTATION ws2300, int temperature_conv, double *dp_min, double *dp_max, struct timestamp *time_min, struct timestamp *time_max); int dewpoint_reset(WEATHERSTATION ws2300, char minmax); int humidity_indoor(WEATHERSTATION ws2300); int humidity_indoor_all(WEATHERSTATION ws2300, int *hum_min, int *hum_max, struct timestamp *time_min, struct timestamp *time_max); int humidity_indoor_reset(WEATHERSTATION ws2300, char minmax); int humidity_outdoor(WEATHERSTATION ws2300); int humidity_outdoor_all(WEATHERSTATION ws2300, int *hum_min, int *hum_max, struct timestamp *time_min, struct timestamp *time_max); int humidity_outdoor_reset(WEATHERSTATION ws2300, char minmax); double wind_current(WEATHERSTATION ws2300, double wind_speed_conv_factor, double *winddir); double wind_all(WEATHERSTATION ws2300, double wind_speed_conv_factor, int *winddir_index, double *winddir); double wind_minmax(WEATHERSTATION ws2300, double wind_speed_conv_factor, double *wind_min, double *wind_max, struct timestamp *time_min, struct timestamp *time_max); int wind_reset(WEATHERSTATION ws2300, char minmax); double windchill(WEATHERSTATION ws2300, int temperature_conv); void windchill_minmax(WEATHERSTATION ws2300, int temperature_conv, double *wc_min, double *wc_max, struct timestamp *time_min, struct timestamp *time_max); int windchill_reset(WEATHERSTATION ws2300, char minmax); double rain_1h(WEATHERSTATION ws2300, double rain_conv_factor); double rain_1h_all(WEATHERSTATION ws2300, double rain_conv_factor, double *rain_max, struct timestamp *time_max); double rain_24h(WEATHERSTATION ws2300, double rain_conv_factor); int rain_1h_max_reset(WEATHERSTATION ws2300); int rain_1h_reset(WEATHERSTATION ws2300); double rain_24h_all(WEATHERSTATION ws2300, double rain_conv_factor, double *rain_max, struct timestamp *time_max); int rain_24h_max_reset(WEATHERSTATION ws2300); int rain_24h_reset(WEATHERSTATION ws2300); double rain_total(WEATHERSTATION ws2300, double rain_conv_factor); double rain_total_all(WEATHERSTATION ws2300, double rain_conv_factor, struct timestamp *time_max); int rain_total_reset(WEATHERSTATION ws2300); double rel_pressure(WEATHERSTATION ws2300, double pressure_conv_factor); void rel_pressure_minmax(WEATHERSTATION ws2300, double pressure_conv_factor, double *pres_min, double *pres_max, struct timestamp *time_min, struct timestamp *time_max); double abs_pressure(WEATHERSTATION ws2300, double pressure_conv_factor); void abs_pressure_minmax(WEATHERSTATION ws2300, double pressure_conv_factor, double *pres_min, double *pres_max, struct timestamp *time_min, struct timestamp *time_max); int pressure_reset(WEATHERSTATION ws2300, char minmax); double pressure_correction(WEATHERSTATION ws2300, double pressure_conv_factor); void tendency_forecast(WEATHERSTATION ws2300, char *tendency, char *forecast); int read_history_info(WEATHERSTATION ws2300, int *interval, int *countdown, struct timestamp *time_last, int *no_records); int read_history_record(WEATHERSTATION ws2300, int record, struct config_type *config, double *temperature_indoor, double *temperature_outdoor, double *pressure, int *humidity_indoor, int *humidity_outdoor, double *raincount, double *windspeed, double *winddir_degrees, double *dewpoint, double *windchill); void light(WEATHERSTATION ws2300, int control); /* Generic functions */ void read_error_exit(void); void write_error_exit(void); void print_usage(void); int get_configuration(struct config_type *, char *path); WEATHERSTATION open_weatherstation(char *device); void close_weatherstation(WEATHERSTATION ws); void address_encoder(int address_in, unsigned char *address_out); void data_encoder(int number, unsigned char encode_constant, unsigned char *data_in, unsigned char *data_out); unsigned char numberof_encoder(int number); unsigned char command_check0123(unsigned char *command, int sequence); unsigned char command_check4(int number); unsigned char data_checksum(unsigned char *data, int number); int initialize(WEATHERSTATION ws2300); void reset_06(WEATHERSTATION ws2300); int read_data(WEATHERSTATION ws2300, int address, int number, unsigned char *readdata, unsigned char *commanddata); int write_data(WEATHERSTATION ws2300, int address, int number, unsigned char encode_constant, unsigned char *writedata, unsigned char *commanddata); int read_safe(WEATHERSTATION ws2300, int address, int number, unsigned char *readdata, unsigned char *commanddata); int write_safe(WEATHERSTATION ws2300, int address, int number, unsigned char encode_constant, unsigned char *writedata, unsigned char *commanddata); /* Platform dependent functions */ int read_device(WEATHERSTATION serdevice, unsigned char *buffer, int size); int write_device(WEATHERSTATION serdevice, unsigned char *buffer, int size); void sleep_short(int milliseconds); void sleep_long(int seconds); int http_request_url(char *urlline); int citizen_weather_send(struct config_type *config, char *datastring); #endif /* _INCLUDE_RW2300_H_ */