diff options
author | Stephane D'Alu <sdalu@sdalu.com> | 2016-02-08 09:37:26 +0100 |
---|---|---|
committer | Stephane D'Alu <sdalu@sdalu.com> | 2016-02-08 09:37:26 +0100 |
commit | d124d1144fc6e8234a8579a09fac314ed35074e6 (patch) | |
tree | 927a83af121c910aecf8d9d6f48e1768a86d598e /os/various/devices_lib/sensors/mcp9808 | |
parent | de87b64728ef28264b622b3583442038a231c90f (diff) | |
download | ChibiOS-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.c | 54 | ||||
-rw-r--r-- | os/various/devices_lib/sensors/mcp9808/mcp9808.h | 83 |
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 |