osd-contiki/platform/redbee-econotag/dev/tmp102-sensor.c
Mariano Alvira 697af5ef08 adding tmp102 sensor for the econotag from Hedde Bosman.
This can be pulling in as a common driver if we can make a generic i2c
Contiki driver.
2011-07-18 07:30:49 -04:00

88 lines
2.1 KiB
C

/*
* An interface to the TI TMP102 temperature sensor
* 12 bit temperature reading, 0.5 deg. Celsius accuracy
* -----------------------------------------------------------------
*
* Author : Hedde Bosman (heddebosman@incas3.eu)
*/
#include "contiki.h"
#include "lib/sensors.h"
#include "dev/tmp102-sensor.h"
#ifndef bool
#define bool uint8_t
#endif
#ifndef false
#define false 0
#endif
#ifndef true
#define true 1
#endif
static void set_configuration(uint8_t rate, bool precision) {
uint8_t tx_buf[] = {TMP102_REGISTER_CONFIGURATION,
0,
(precision ? TMP102_CONF_EXTENDED_MODE : 0) | ((rate << 6) & TMP102_CONF_CONVERSION_RATE)
};
i2c_transmitinit(TMP102_ADDR, 3, tx_buf);
}
/*---------------------------------------------------------------------------*/
static int value(int type) {
uint8_t reg = TMP102_REGISTER_TEMPERATURE;
uint8_t temp[2];
int16_t temperature = 0;
/* transmit the register to start reading from */
i2c_transmitinit(TMP102_ADDR, 1, &reg);
while (!i2c_transferred()); // wait for data to arrive
/* receive the data */
i2c_receiveinit(TMP102_ADDR, 2, temp);
while (!i2c_transferred()); // wait for data to arrive
// 12 bit normal mode
temperature = ((temp[0] <<8) | (temp[1])) >> 4; // lsb
// 13 bit extended mode
//temperature = ((temp[0] <<8) | (temp[1])) >> 3; // lsb
temperature = (100*temperature)/16; // in 100th of degrees
return temperature;
}
/*---------------------------------------------------------------------------*/
static int status(int type) {
switch (type) {
case SENSORS_ACTIVE:
case SENSORS_READY:
return 1; // fix?
break;
}
return 0;
}
/*---------------------------------------------------------------------------*/
static int configure(int type, int c) {
switch (type) {
case SENSORS_ACTIVE:
if (c) {
// set active
set_configuration(1, false); // every 1 second, 12bit precision
} else {
// set inactive
}
return 1;
}
return 0;
}
/*---------------------------------------------------------------------------*/
SENSORS_SENSOR(tmp102_sensor, "Temperature", value, configure, status); // register the functions