summaryrefslogtreecommitdiffstats
path: root/weatherstation.h
blob: 16d705cd1b156351c4cfb2b4d9001afd7e52a279 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
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