aboutsummaryrefslogtreecommitdiffstats
path: root/os/various/devices_lib/sensors/hdc1000/hdc1000.h
blob: 43090d9ab3b81dc50f42a0b8e6f45affabef1bd9 (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
/*
    HDC1000 for ChibiOS/RT - Copyright (C) 2016 Stephane D'Alu
*/

/**
 * @file    hdc1000.h
 * @brief   HDC1000 Temperature/Humidiry sensor interface module header.
 *
 * @{
 */

#ifndef _SENSOR_HDC1000_H_
#define _SENSOR_HDC1000_H_

#include <math.h>
#include <stdbool.h>
#include "i2c_helpers.h"

// I2C address
#define HDC1000_I2CADDR_1           0x40
#define HDC1000_I2CADDR_2           0x41
#define HDC1000_I2CADDR_3           0x42
#define HDC1000_I2CADDR_4           0x43

#ifndef HDC1000_I2CADDR
#define HDC1000_I2CADDR             HDC1000_I2CADDR_1
#endif

// Size of serial (40 bits)
#define HDC1000_SERIAL_SIZE         5

#define HDC1000_CONTINUOUS_ACQUISITION_SUPPORTED   FALSE


/**
 * When changing sensor settings, you generally need to wait
 * for 2 * getAquisitionTime(), as usually the first acquisition
 * will be corrupted by the change of settings.
 *
 * No locking is done.
 */


/**
 * @brief   HDC1000 configuration structure.
 */
typedef struct {
    I2CHelper i2c; /* keep it first */
} HDC1000_config;


/**
 * @brief   Driver state machine possible states.
 */
typedef enum __attribute__ ((__packed__)) {
    HDC1000_UNINIT    = 0,            /**< Not initialized.                */
    HDC1000_INIT      = 1,            /**< Initialized.                    */
    HDC1000_STARTED   = 2,            /**< Started.                        */
    HDC1000_MEASURING = 4,            /**< Measuring.                      */
    HDC1000_READY     = 3,            /**< Ready.                          */
    HDC1000_STOPPED   = 5,            /**< Stopped.                        */
    HDC1000_ERROR     = 6,            /**< Error.                          */
} HDC1000_state_t;



/**
 * @brief   HDC1000 configuration structure.
 */
typedef struct {
    HDC1000_config  *config;
    HDC1000_state_t  state;
    unsigned int     delay;    
    uint16_t         cfg;
} HDC1000_drv;

/**
 * @brief Initialize the sensor driver
 */
void
HDC1000_init(HDC1000_drv *drv,
	HDC1000_config *config);

/**
 * @brief Start the sensor
 */
msg_t
HDC1000_start(HDC1000_drv *drv);

/**
 * @brief   Stop the sensor
 *
 * @details If the sensor support it, it will be put in low energy mode.
 */
msg_t
HDC1000_stop(HDC1000_drv *drv);

/**
 * @brief   Check that the sensor is really present
 */
msg_t
HDC1000_check(HDC1000_drv *drv);


msg_t
HDC1000_readSerial(HDC1000_drv *drv, uint8_t *serial);

/**
 * @brief   Control the HD1000 heater.
 */
msg_t
HDC1000_setHeater(HDC1000_drv *drv,
	bool on);


/**
 * @brief Time necessary for the sensor to boot
 *
 * @returns
 *   unsigned int   time in millis-seconds
 */

static inline unsigned int
HDC1000_getBootupTime(HDC1000_drv *drv) {
    (void)drv;
    return 15;
};

/**
 * @brief Time necessary the sensor to for starting
 *
 * @returns
 *   unsigned int   time in millis-seconds
 */
static inline unsigned int
HDC1000_getStartupTime(HDC1000_drv *drv) {
    (void)drv;
    return 0;
};

/**
 * @brief Time in milli-seconds necessary for acquiring a naw measure
 *
 * @returns
 *   unsigned int   time in millis-seconds
 */
static inline unsigned int
HDC1000_getAcquisitionTime(HDC1000_drv *drv) {
    return drv->delay;
}

/**
 * @brief Trigger a mesure acquisition
 */
msg_t
HDC1000_startMeasure(HDC1000_drv *drv);

/**
 * @brief Read the newly acquiered measure
 *
 * @note  According the the sensor design the measure read
 *        can be any value acquired after the acquisition time
 *        and the call to readMeasure.
 */
msg_t
HDC1000_readMeasure(HDC1000_drv *drv,
	float *temperature, float *humidity);


/**
 * @brief   Read temperature and humidity
 *
 * @details According to the sensor specification/configuration
 *          (see #HDC1000_CONTINUOUS_ACQUISITION_SUPPORTED), 
 *          if the sensor is doing continuous measurement
 *          it's value will be requested and returned immediately.
 *          Otherwise a measure is started, the necessary amount of
 *          time for acquiring the value is spend sleeping (not spinning),
 *          and finally the measure is read.
 *
 * @note    In continuous measurement mode, if you just started
 *          the sensor, you will need to wait getAcquisitionTime()
 *          in addition to the usual getStartupTime()

 * @note    If using several sensors, it is better to start all the
 *          measure together, wait for the sensor having the longuest
 *          aquisition time, and finally read all the values
 */
msg_t
HDC1000_readTemperatureHumidity(HDC1000_drv *drv,
	float *temperature, float *humidity);

/**
 * @brief   Return the humidity value in percent.
 *
 * @details Use readTemperatureHumidity() for returning the humidity value.
 *
 * @note    Prefere readTemperatureHumidity(), if you need both temperature
 *          and humidity, or if you need better error handling.
 *
 * @returns
 *   float  humidity percent
 *   NAN    on failure
 */
static inline float
HDC1000_getHumidity(HDC1000_drv *drv) {
    float humidity   = NAN;
    HDC1000_readTemperatureHumidity(drv, NULL, &humidity);
    return humidity;
}

/**
 * @brief   Return the temperature value in °C.
 *
 * @details Use readTemperatureHumidity() for returning the humidity value.
 *
 * @note    Prefere readTemperatureHumidity(), if you need both temperature
 *          and humidity, or if you need better error handling.
 *
 * @returns
 *   float  humidity percent
 *   NAN    on failure
 */
static inline float
HDC1000_getTemperature(HDC1000_drv *drv) {
    float temperature = NAN;
    HDC1000_readTemperatureHumidity(drv, &temperature, NULL);
    return temperature;
}


#endif