1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/drivers/include/sdp3x.h

199 lines
5.5 KiB
C

/*
* Copyright (C) 2019 Dirk Ehmen
* 2020 Nishchay Agrawal
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
/**
* @defgroup drivers_sdp3x SDP3x temperature and differential pressure sensor
* @ingroup drivers_sensors
* @{
* @file
* @brief Device driver interface for the SDP3x sensor.
*
* @author Dirk Ehmen <ehmen@ibr.cs.tu-bs.de>
* @author Nishchay Agrawal <f2016088@pilani.bits-pilani.ac.in>
* @}
*/
#ifndef SDP3X_H
#define SDP3X_H
#include "saul.h"
#include "xtimer.h"
#include "mutex.h"
#include "periph/i2c.h"
#include "periph/gpio.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief Flags for sensor reading
* @{
*/
#define SDP3X_FLAG_MASS_FLOW 0x02 /**< Use Mass Flow for Temperature Compensation */
#define SDP3X_FLAG_DIFF_PRESS 0x00 /**< Use Differential Pressure for Temperature Compensation */
#define SDP3X_FLAG_AVERAGE 0x01 /**< Average values */
#define SDP3X_FLAG_NO_AVERAGE 0x00 /**< Don't Average values */
/** @} */
/**
* @brief Device initialization parameters
*/
typedef struct {
i2c_t i2c_dev; /**< I2C device which is used */
uint8_t i2c_addr; /**< I2C address */
gpio_t irq_pin; /**< IRQ pin to check data ready */
} sdp3x_params_t;
/**
* @brief Device descriptor for the SDP3x sensor
*/
typedef struct {
bool continuous_measurement; /**< Device measuring data continuously */
sdp3x_params_t params; /**< Device initialization parameters */
mutex_t mutex; /**< Mutex for this sdp3x dev */
} sdp3x_t;
/**
* @brief Measurement from SDP3x sensor
*/
typedef struct {
int32_t differential_pressure; /**< Differential Pressure measured
in centiPa */
int32_t temperature; /**< Temperature measured in centi°C */
} sdp3x_measurement_t;
/**
* @brief Status and error return codes
*/
enum {
SDP3x_OK = 0, /**< all went as expected */
SDP3x_CRCERROR = -1, /**< CRC-Check failed */
SDP3x_NODATA = -2, /**< No Data available */
SDP3x_IOERROR = -3, /**< I/O error */
SDP3x_WRONGSIZE = -4 /**< Wrong size of array for method */
};
/**
* @brief Initialize SDP3x
*
* @param dev sdp3x device
* @param params sdp3x device params
*
* @return 1 if device started
*/
int sdp3x_init(sdp3x_t *dev, const sdp3x_params_t *params);
/**
* @brief Start Continuous Measuring
*
* @param dev sdp3x device
* @param flags stores Temperature compensation and averaging flags
* 0th bit-> 0 = No averaging, 1 = Average values
* 1st bit-> 0 = Differential pressure, 1 = Mass Flow
*
* @return 1 if device started
*/
int8_t sdp3x_start_continuous(sdp3x_t *dev, uint8_t flags);
/**
* @brief read temperature and differential pressure
*
* @param result struct to store result
* @param dev sdp3x device
*
* @return 1 on success
*/
int8_t sdp3x_read_continuous(sdp3x_measurement_t *result, sdp3x_t *dev);
/**
* @brief Read current temperature value
*
* @param dev sdp3x device
* @param flags stores Temperature compensation
* 1st bit-> 0 = Differential pressure, 1 = Mass Flow
*
* @return Current temperature in celsius multiplied by 100
* to preserve accuracy and return in integer
*/
int32_t sdp3x_read_single_temperature(sdp3x_t *dev, uint8_t flags);
/**
* @brief Read current differential_pressure value
*
* @param dev sdp3x device
* @param flags stores Temperature compensation
* 1st bit-> 0 = Differential pressure, 1 = Mass Flow
*
* @return current differential pressure in centipascal
*/
int32_t sdp3x_read_single_differential_pressure(sdp3x_t *dev,
uint8_t flags);
/**
* @brief read temperature and differential pressure
*
* @param dev sdp3x device
* @param flags stores Temperature compensation
* 1st bit-> 0 = Differential pressure, 1 = Mass Flow
* @param result Values are stored in this struct
*
* @return 1 on success
*/
int8_t sdp3x_read_single_measurement(sdp3x_t *dev, uint8_t flags,
sdp3x_measurement_t *result);
/**
* @brief Stop Continuous Measuring
*
* It takes 500 us till next command.
*
* @param dev device
* @param continuous_timer timer running to trigger reading data
*
* @return 0 if measurement stopped
*/
int8_t sdp3x_stop_continuous(sdp3x_t *dev, xtimer_t *continuous_timer);
/**
* @brief Resets all I2C devices
*
* @param dev device
*
* @return 0 if reset is started
*/
int8_t sdp3x_soft_reset(const sdp3x_t *dev);
/**
* @brief Activates sleep mode
*
* Only activates Sleep Mode if the device is in Idle Mode
*
* @param dev device
*
* @return 0 if sleep is activated
*/
int8_t sdp3x_enter_sleep(const sdp3x_t *dev);
/**
* @brief Exit sleep mode
*
* @param dev device
*
* @return 0 if sleep is deactivated
*/
int8_t sdp3x_exit_sleep(const sdp3x_t *dev);
#ifdef __cplusplus
}
#endif
#endif /* SDP3X_H */