diff options
Diffstat (limited to 'weatherstation.h')
-rw-r--r-- | weatherstation.h | 257 |
1 files changed, 257 insertions, 0 deletions
diff --git a/weatherstation.h b/weatherstation.h new file mode 100644 index 0000000..16d705c --- /dev/null +++ b/weatherstation.h @@ -0,0 +1,257 @@ +/* weather.h + * Copyright (c) 2012, Sebastian Reichel <sre@ring0.de> + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +#ifndef _WEATHER_STATION_H +#define _WEATHER_STATION_H + +#include <inttypes.h> + +enum weather_wind_direction { + NORTH, + NORTH_EAST_NORTH, + NORTH_EAST, + EAST_NORTH_EAST, + EAST, + EAST_SOUTH_EAST, + SOUTH_EAST, + SOUTH_EAST_SOUTH, + SOUTH, + SOUTH_WEST_SOUTH, + SOUTH_WEST, + WEST_SOUTH_WEST, + WEST, + WEST_NORTH_WEST, + NORTH_WEST, + NORTH_WEST_NORTH +}; + +enum weather_flag_status { + WEATHER_STATUS_INVALID_DATA = 0x40, + WEATHER_STATUS_RAIN_OVERFLOW = 0x80 +}; + +enum weather_flag_unit_setting1 { + WEATHER_UNIT_IN_TEMP_FAHRENHEIT = 0x01, + WEATHER_UNIT_OUT_TEMP_FAHRENHEIT = 0x02, + WEATHER_UNIT_RAIN_INCH = 0x04, + WEATHER_UNIT_PRESSURE_HPA = 0x20, + WEATHER_UNIT_PRESSURE_INHG = 0x40, + WEATHER_UNIT_PRESSURE_MMHG = 0x80 +}; + +enum weather_flag_unit_setting2 { + WEATHER_UNIT_WIND_SPEED_MS = 0x01, + WEATHER_UNIT_WIND_SPEED_KMH = 0x02, + WEATHER_UNIT_WIND_SPEED_KNOT = 0x04, + WEATHER_UNIT_WIND_SPEED_MH = 0x08, + WEATHER_UNIT_WIND_SPEED_BFT = 0x10 +}; + +enum weather_flag_display_format1 { + WEATHER_DISPLAY_FORMAT_PRESSURE_RELATIVE = 0x01, + WEATHER_DISPLAY_FORMAT_WIND_SPEED_GUST = 0x02, + WEATHER_DISPLAY_FORMAT_TIME_12H = 0x04, + WEATHER_DISPLAY_FORMAT_TIME_MMDDYY = 0x08, + WEATHER_DISPLAY_FORMAT_TIME_24H_SCALE = 0x10, + WEATHER_DISPLAY_FORMAT_COMPLETE_DATE = 0x20, + WEATHER_DISPLAY_FORMAT_DATE_WEEK = 0x40, + WEATHER_DISPLAY_FORMAT_ALARM = 0x80 +}; + +enum weather_flag_display_format2 { + WEATHER_DISPLAY_FORMAT_OUT_TEMP = 0x01, + WEATHER_DISPLAY_FORMAT_OUT_WINDCHILL = 0x02, + WEATHER_DISPLAY_FORMAT_OUT_DEW_POINT = 0x04, + WEATHER_DISPLAY_FORMAT_RAIN_1H = 0x08, + WEATHER_DISPLAY_FORMAT_RAIN_24H = 0x10, + WEATHER_DISPLAY_FORMAT_RAIN_WEEK = 0x20, + WEATHER_DISPLAY_FORMAT_RAIN_MONTH = 0x40, + WEATHER_DISPLAY_FORMAT_RAIN_TOTAL = 0x80 +}; + +enum weather_flag_alarm1 { + WEATHER_ALARM_TIME = 0x02, + WEATHER_ALARM_WIND_DIRECTION = 0x04, + WEATHER_ALARM_IN_HUMIDITY_LOW = 0x10, + WEATHER_ALARM_IN_HUMIDITY_HIGH = 0x20, + WEATHER_ALARM_OUT_HUMIDITY_LOW = 0x40, + WEATHER_ALARM_OUT_HUMIDITY_HIGH = 0x80 +}; + +enum weather_flag_alarm2 { + WEATHER_ALARM_AVERAGE_WIND_SPEED = 0x01, + WEATHER_ALARM_GUST_WIND_SPEED = 0x02, + WEATHER_ALARM_RAIN_1H = 0x04, + WEATHER_ALARM_RAIN_24H = 0x08, + WEATHER_ALARM_ABS_PRESSURE_LOW = 0x10, + WEATHER_ALARM_ABS_PRESSURE_HIGH = 0x20, + WEATHER_ALARM_REL_PRESSURE_LOW = 0x40, + WEATHER_ALARM_REL_PRESSURE_HIGH = 0x80 +}; + +enum weather_flag_alarm3 { + WEATHER_ALARM_IN_TEMP_LOW = 0x01, + WEATHER_ALARM_IN_TEMP_HIGH = 0x02, + WEATHER_ALARM_OUT_TEMP_LOW = 0x04, + WEATHER_ALARM_OUT_TEMP_HIGH = 0x08, + WEATHER_ALARM_WINDCHILL_LOW = 0x10, + WEATHER_ALARM_WINDCHILL_HIGH = 0x20, + WEATHER_ALARM_DEW_POINT_LOW = 0x40, + WEATHER_ALARM_DRW_POINT_HIGH = 0x80 +}; + +struct weather_data { + uint8_t sample_time; + uint8_t humidity_indoor; + uint16_t temperature_indoor; + uint8_t humidity_outdoor; + uint16_t temperature_outdoor; + uint16_t pressure; + uint8_t avg_wind_speed; + uint8_t gust_wind_speed; + uint8_t high_nibble_wind_speed; + uint8_t wind_direction; + uint16_t rain; + uint8_t status; +} __attribute__((packed)); + +struct weather_time { + uint8_t year; + uint8_t month; + uint8_t date; + uint8_t hour; + uint8_t minute; +} __attribute__((packed)); + +struct weather_header_timestamps { + struct weather_time in_humidity_max; + struct weather_time in_humidity_min; + struct weather_time out_humidity_max; + struct weather_time out_humidity_min; + struct weather_time in_temp_max; + struct weather_time in_temp_min; + struct weather_time out_temp_max; + struct weather_time out_temp_min; + struct weather_time wind_chill_max; + struct weather_time wind_chill_min; + struct weather_time dew_point_max; + struct weather_time dew_point_min; + struct weather_time absolute_pressure_max; + struct weather_time absolute_pressure_min; + struct weather_time relative_pressure_max; + struct weather_time relative_pressure_min; + struct weather_time wsp_average_max; + struct weather_time wsp_gust_max; + struct weather_time rain_1h_max; + struct weather_time rain_24h_max; + struct weather_time rain_week_max; + struct weather_time rain_month_max; + struct weather_time rain_total_max; +} __attribute__((packed)); + +struct weather_header_alarms { + uint8_t in_humidity_high; + uint8_t in_humidity_low; + uint16_t in_temp_high; + uint16_t in_temp_low; + uint8_t out_humidity_high; + uint8_t out_humidity_low; + uint16_t out_temp_high; + uint16_t out_temp_low; + uint16_t wind_chill_high; + uint16_t wind_chill_low; + uint16_t dew_point_high; + uint16_t dew_point_low; + uint16_t absolute_pressure_high; + uint16_t absolute_pressure_low; + uint16_t relative_pressure_high; + uint16_t relative_pressure_low; + uint8_t average_bft_high; + uint16_t average_wsp_high; + uint8_t gust_bft_high; + uint16_t gust_wsp_high; + uint8_t wind_direction; + uint16_t rain_1h_high; + uint16_t rain_24h_high; + uint8_t hour; + uint8_t minute; +} __attribute__((packed)); + +struct weather_header_records { + uint8_t in_humidity_max; + uint8_t in_humidity_min; + uint8_t out_humidity_max; + uint8_t out_humidity_min; + uint16_t in_temp_max; + uint16_t in_temp_min; + uint16_t out_temp_max; + uint16_t out_temp_min; + uint16_t windchill_max; + uint16_t windchill_min; + uint16_t dew_point_max; + uint16_t dew_point_min; + uint16_t absolute_pressure_max; + uint16_t absolute_pressure_min; + uint16_t relative_pressure_max; + uint16_t relative_pressure_min; + uint16_t wsp_average_max; + uint16_t wsp_gust_max; + uint16_t rain_1h_max; + uint16_t rain_24h_max; + uint16_t rain_week_max; + uint16_t rain_month_max; + uint16_t rain_total_max; + uint8_t nibble; +} __attribute__((packed)); + +struct weather_header { + uint8_t eeprom_init_flag1; + uint8_t eeprom_init_flag2; + uint8_t padding1[14]; + uint8_t sampling_interval; + uint8_t unit_setting1; + uint8_t unit_setting2; + uint8_t display_format1; + uint8_t display_format2; + uint8_t alarm_enable1; + uint8_t alarm_enable2; + uint8_t alarm_enable3; + uint8_t timezone; + uint8_t padding2[1]; + uint8_t data_refreshed; + uint16_t history_data_sets; + uint8_t padding3[1]; + uint16_t history_data_stack; + uint16_t relative_pressure; + uint16_t absolute_pressure; + uint8_t padding4[12]; + struct weather_header_alarms alarm; + uint8_t padding5[9]; + struct weather_header_records record; + struct weather_header_timestamps timestamp; +} __attribute__((packed)); + +struct weather_station { + struct usb_dev_handle *dev; +}; + +struct weather_station* weather_station_init(); +void weather_station_free(struct weather_station *self); +void weather_station_read_data(struct weather_station *self, uint16_t addr, struct weather_data *data); +void weather_station_read_header(struct weather_station *self, struct weather_header *data); +void weather_station_write(struct weather_station *self, uint16_t addr, uint8_t byte); +char * weather_wind_direction_to_string(enum weather_wind_direction dir); + +#endif |