summaryrefslogtreecommitdiffstats
path: root/weatherstation.h
diff options
context:
space:
mode:
Diffstat (limited to 'weatherstation.h')
-rw-r--r--weatherstation.h257
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