/* weather.h * Copyright (c) 2012, Sebastian Reichel * * 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 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