aboutsummaryrefslogtreecommitdiffstats
path: root/os/various/devices_lib/sensors/mcp9808
diff options
context:
space:
mode:
authorStephane D'Alu <sdalu@sdalu.com>2016-02-08 09:37:26 +0100
committerStephane D'Alu <sdalu@sdalu.com>2016-02-08 09:37:26 +0100
commitd124d1144fc6e8234a8579a09fac314ed35074e6 (patch)
tree927a83af121c910aecf8d9d6f48e1768a86d598e /os/various/devices_lib/sensors/mcp9808
parentde87b64728ef28264b622b3583442038a231c90f (diff)
downloadChibiOS-Contrib-d124d1144fc6e8234a8579a09fac314ed35074e6.tar.gz
ChibiOS-Contrib-d124d1144fc6e8234a8579a09fac314ed35074e6.tar.bz2
ChibiOS-Contrib-d124d1144fc6e8234a8579a09fac314ed35074e6.zip
added TSL2561 Light sesnor
Diffstat (limited to 'os/various/devices_lib/sensors/mcp9808')
-rw-r--r--os/various/devices_lib/sensors/mcp9808/mcp9808.c54
-rw-r--r--os/various/devices_lib/sensors/mcp9808/mcp9808.h83
2 files changed, 67 insertions, 70 deletions
diff --git a/os/various/devices_lib/sensors/mcp9808/mcp9808.c b/os/various/devices_lib/sensors/mcp9808/mcp9808.c
index df4d440..296c2f1 100644
--- a/os/various/devices_lib/sensors/mcp9808/mcp9808.c
+++ b/os/various/devices_lib/sensors/mcp9808/mcp9808.c
@@ -63,6 +63,16 @@
/*===========================================================================*/
static inline msg_t
+_apply_config(MCP9808_drv *drv) {
+ struct __attribute__((packed)) {
+ uint8_t reg;
+ uint16_t conf;
+ } tx = { MCP9808_REG_CONFIG, cpu_to_be16(drv->cfg) };
+
+ return i2c_send((uint8_t*)&tx, sizeof(tx));
+}
+
+static inline msg_t
_decode_measure(MCP9808_drv *drv,
uint16_t val, float *temperature) {
@@ -95,24 +105,21 @@ void
MCP9808_init(MCP9808_drv *drv, MCP9808_config *config) {
drv->config = config;
drv->cfg = 0;
- drv->resolution = RES_16;
- drv->state = MCP9808_INIT;
+ drv->resolution = RES_16; /* power up default */
+ drv->state = SENSOR_INIT;
}
msg_t
MCP9808_check(MCP9808_drv *drv) {
- msg_t msg = -10;
- uint16_t val;
+ uint16_t manuf, device;
- if ((msg = i2c_reg_recv16_be(MCP9808_REG_MANUF_ID, &val)) < MSG_OK)
+ msg_t msg;
+ if (((msg = i2c_reg_recv16_be(MCP9808_REG_MANUF_ID, &manuf )) < MSG_OK) ||
+ ((msg = i2c_reg_recv16_be(MCP9808_REG_DEVICE_ID, &device)) < MSG_OK))
return msg;
- if (val != MCP9808_MANUF_ID)
- return -2;
- if ((msg = i2c_reg_recv16_be(MCP9808_REG_DEVICE_ID, &val)) < MSG_OK)
- return msg;
- if (val != MCP9808_DEVICE_ID)
- return -2;
+ if ((manuf != MCP9808_MANUF_ID) || (device != MCP9808_DEVICE_ID))
+ return SENSOR_NOTFOUND;
return MSG_OK;
}
@@ -132,33 +139,18 @@ MCP9808_setResolution(MCP9808_drv *drv, MCP9808_resolution_t res) {
return MSG_OK;
}
-
msg_t
MCP9808_start(MCP9808_drv *drv) {
drv->cfg &= ~(MCP9808_REG_CONFIG_SHUTDOWN);
-
- struct __attribute__((packed)) {
- uint8_t reg;
- uint16_t conf;
- } tx = { MCP9808_REG_CONFIG, cpu_to_be16(drv->cfg) };
-
- return i2c_send((uint8_t*)&tx, sizeof(tx)) >= 0;
+ return _apply_config(drv);
}
msg_t
MCP9808_stop(MCP9808_drv *drv) {
drv->cfg |= (MCP9808_REG_CONFIG_SHUTDOWN);
-
- struct __attribute__((packed)) {
- uint8_t reg;
- uint16_t conf;
- } tx = { MCP9808_REG_CONFIG, cpu_to_be16(drv->cfg) };
-
- return i2c_send((uint8_t*)&tx, sizeof(tx)) >= 0;
+ return _apply_config(drv);
}
-
-
unsigned int
MCP9808_getAcquisitionTime(MCP9808_drv *drv) {
switch(drv->resolution) {
@@ -167,8 +159,8 @@ MCP9808_getAcquisitionTime(MCP9808_drv *drv) {
case RES_8 : return MCP9808_DELAY_ACQUIRE_RES_8;
case RES_16: return MCP9808_DELAY_ACQUIRE_RES_16;
}
- osalDbgAssert(false, "programming error");
- return -1;
+ osalDbgAssert(false, "OOPS");
+ return 0;
}
msg_t
@@ -188,7 +180,7 @@ MCP9808_readMeasure(MCP9808_drv *drv,
msg_t
MCP9808_readTemperature(MCP9808_drv *drv,
float *temperature) {
- osalDbgAssert(drv->state == MCP9808_STARTED, "invalid state");
+ osalDbgAssert(drv->state == SENSOR_STARTED, "invalid state");
msg_t msg;
uint16_t val;
diff --git a/os/various/devices_lib/sensors/mcp9808/mcp9808.h b/os/various/devices_lib/sensors/mcp9808/mcp9808.h
index 6a8725d..2d488d7 100644
--- a/os/various/devices_lib/sensors/mcp9808/mcp9808.h
+++ b/os/various/devices_lib/sensors/mcp9808/mcp9808.h
@@ -6,22 +6,42 @@
#define _SENSOR_MCP9808_H_
#include <math.h>
-#include <stdbool.h>
#include "i2c_helpers.h"
+#include "sensor.h"
+/*===========================================================================*/
+/* Driver constants. */
+/*===========================================================================*/
-#define MCP9808_I2CADDR_DEFAULT 0x18
+#define MCP9808_CONTINUOUS_ACQUISITION_SUPPORTED TRUE
-typedef enum {
- RES_2 = 0x00, /* 1/2 = 0.5 */
- RES_4 = 0x01, /* 1/4 = 0.25 */
- RES_8 = 0x10, /* 1/8 = 0.125 */
- RES_16 = 0x11, /* 1/16 = 0.0625 */
-} MCP9808_resolution_t;
+#define MCP9808_I2CADDR 0x18
-#define MCP9808_CONTINUOUS_ACQUISITION_SUPPORTED TRUE
+/*===========================================================================*/
+/* Driver pre-compile time settings. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Derived constants and error checks. */
+/*===========================================================================*/
+
+#define MCP9808_I2CADDR_DEFAULT MCP9808_I2CADDR
+
+/*===========================================================================*/
+/* Driver data structures and types. */
+/*===========================================================================*/
+
+/**
+ * @brief Different possible resolution
+ */
+typedef enum {
+ RES_2 = 0x00, /**< @brief Resolution of 1/2 = 0.5 */
+ RES_4 = 0x01, /**< @brief Resolution of 1/4 = 0.25 */
+ RES_8 = 0x10, /**< @brief Resolution of 1/8 = 0.125 */
+ RES_16 = 0x11, /**< @brief Resolution of 1/16 = 0.0625 */
+} MCP9808_resolution_t;
/**
* @brief MCP9808 configuration structure.
@@ -30,26 +50,12 @@ typedef struct {
I2CHelper i2c; /* keep it first */
} MCP9808_config;
-
-/**
- * @brief Driver state machine possible states.
- */
-typedef enum __attribute__ ((__packed__)) {
- MCP9808_UNINIT = 0, /**< Not initialized. */
- MCP9808_INIT = 1, /**< Initialized. */
- MCP9808_STARTED = 2, /**< Started. */
- MCP9808_MEASURING = 4, /**< Measuring. */
- MCP9808_READY = 3, /**< Ready. */
- MCP9808_STOPPED = 5, /**< Stopped. */
- MCP9808_ERROR = 6, /**< Error. */
-} MCP9808_state_t;
-
/**
* @brief MCP9808 configuration structure.
*/
typedef struct {
MCP9808_config *config;
- MCP9808_state_t state;
+ sensor_state_t state;
MCP9808_resolution_t resolution;
uint16_t cfg;
} MCP9808_drv;
@@ -61,6 +67,15 @@ typedef struct {
float temperature;
} MCP9808_measure;
+/*===========================================================================*/
+/* Driver macros. */
+/*===========================================================================*/
+
+
+/*===========================================================================*/
+/* External declarations. */
+/*===========================================================================*/
+
/**
* @brief Initialize the sensor driver
*/
@@ -88,8 +103,6 @@ MCP9808_start(MCP9808_drv *drv);
msg_t
MCP9808_stop(MCP9808_drv *drv);
-
-
/**
* @brief Control the MCP9809 resolution.
*/
@@ -97,7 +110,6 @@ msg_t
MCP9808_setResolution(MCP9808_drv *drv,
MCP9808_resolution_t res);
-
/**
* @brief Time necessary for the sensor to boot
*
@@ -137,6 +149,7 @@ MCP9808_getAcquisitionTime(MCP9808_drv *drv);
*/
static inline msg_t
MCP9808_startMeasure(MCP9808_drv *drv) {
+ (void)drv;
return MSG_OK;
}
@@ -178,14 +191,11 @@ MCP9808_readTemperature(MCP9808_drv *drv,
/**
* @brief Return the temperature value in °C.
*
- * @details Use readTemperatureHumidity() for returning the humidity value.
+ * @note Prefere readTemperature(), if you need better error handling.
*
- * @note Prefere readTemperatureHumidity(), if you need both temperature
- * and humidity, or if you need better error handling.
- *
- * @returns
- * float humidity percent
- * NAN on failure
+ * @return The temperature in °C
+ * @retval float humidity percent
+ * @retval NAN on failure
*/
static inline float
MCP9808_getTemperature(MCP9808_drv *drv) {
@@ -194,10 +204,5 @@ MCP9808_getTemperature(MCP9808_drv *drv) {
return temperature;
}
-
-
-
-
-
#endif