Program Listing for File xensiv_pasco2.h¶
↰ Return to documentation for file (src/xensiv_pasco2.h)
/***********************************************************************************************/
#ifndef XENSIV_PASCO2_H_
#define XENSIV_PASCO2_H_
#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>
#include "xensiv_pasco2_regs.h"
/************************************** Macros *******************************************/
#define XENSIV_PASCO2_OK (0)
#define XENSIV_PASCO2_ERR_COMM (1)
#define XENSIV_PASCO2_ERR_WRITE_TOO_LARGE (2)
#define XENSIV_PASCO2_ERR_NOT_READY (3)
#define XENSIV_PASCO2_ICCERR (4)
#define XENSIV_PASCO2_ORVS (5)
#define XENSIV_PASCO2_ORTMP (6)
#define XENSIV_PASCO2_READ_NRDY (7)
#define XENSIV_PASCO2_MEAS_RATE_MIN (5U)
#define XENSIV_PASCO2_MEAS_RATE_MAX (4095U)
#define XENSIV_PASCO2_I2C_ADDR (0x28U)
/********************************* Type definitions **************************************/
typedef enum
{
XENSIV_PASCO2_CMD_SOFT_RESET = 0xA3U,
XENSIV_PASCO2_CMD_RESET_ABOC = 0xBCU,
XENSIV_PASCO2_CMD_SAVE_FCS_CALIB_OFFSET = 0xCFU,
XENSIV_PASCO2_CMD_RESET_FCS = 0xFCU,
} xensiv_pasco2_cmd_t;
typedef enum
{
XENSIV_PASCO2_OP_MODE_IDLE = 0U,
XENSIV_PASCO2_OP_MODE_SINGLE = 1U,
XENSIV_PASCO2_OP_MODE_CONTINUOUS = 2U
} xensiv_pasco2_op_mode_t;
typedef enum
{
XENSIV_PASCO2_BOC_CFG_DISABLE = 0U,
XENSIV_PASCO2_BOC_CFG_AUTOMATIC = 1U,
XENSIV_PASCO2_BOC_CFG_FORCED = 2U
} xensiv_pasco2_boc_cfg_t;
typedef enum
{
XENSIV_PASCO2_PWM_MODE_SINGLE_PULSE = 0U,
XENSIV_PASCO2_PWM_MODE_TRAIN_PULSE = 1U
} xensiv_pasco2_pwm_mode_t;
typedef enum
{
XENSIV_PASCO2_INTERRUPT_TYPE_LOW_ACTIVE = 0U,
XENSIV_PASCO2_INTERRUPT_TYPE_HIGH_ACTIVE = 1U
} xensiv_pasco2_interrupt_type_t;
typedef enum
{
XENSIV_PASCO2_INTERRUPT_FUNCTION_NONE = 0U,
XENSIV_PASCO2_INTERRUPT_FUNCTION_ALARM = 1U,
XENSIV_PASCO2_INTERRUPT_FUNCTION_DRDY = 2U,
XENSIV_PASCO2_INTERRUPT_FUNCTION_BUSY = 3U,
XENSIV_PASCO2_INTERRUPT_FUNCTION_EARLY = 4U
} xensiv_pasco2_interrupt_function_t;
typedef enum
{
XENSIV_PASCO2_ALARM_TYPE_HIGH_TO_LOW = 0U,
XENSIV_PASCO2_ALARM_TYPE_LOW_TO_HIGH = 1U
} xensiv_pasco2_alarm_type_t;
typedef union
{
struct
{
uint32_t rev:5;
uint32_t prod:3;
} b;
uint8_t u;
} xensiv_pasco2_id_t;
typedef union
{
struct
{
uint32_t :3;
uint32_t iccerr:1;
uint32_t orvs:1;
uint32_t ortmp:1;
uint32_t pwm_dis_st:1;
uint32_t sen_rdy:1;
} b;
uint8_t u;
} xensiv_pasco2_status_t;
typedef union
{
struct
{
uint32_t op_mode:2;
uint32_t boc_cfg:2;
uint32_t pwm_mode:1;
uint32_t pwm_outen:1;
uint32_t :2;
} b;
uint8_t u;
} xensiv_pasco2_measurement_config_t;
typedef union
{
struct
{
uint32_t alarm_typ:1;
uint32_t int_func:3;
uint32_t int_typ:1;
uint32_t :3;
} b;
uint8_t u;
} xensiv_pasco2_interrupt_config_t;
typedef union
{
struct
{
uint32_t :2;
uint32_t alarm:1;
uint32_t int_sts:1;
uint32_t drdy:1;
uint32_t :3;
} b;
uint8_t u;
} xensiv_pasco2_meas_status_t;
struct xensiv_pasco2; /* Forward declaration */
/* Function pointer to the platform-specific function for reading the sensor registers via I2C/UART */
typedef int32_t (*xensiv_pasco2_read_fptr_t)(const struct xensiv_pasco2 * dev, uint8_t reg_addr, uint8_t * data, uint8_t len);
/* Function pointer to the platform-specific function for writing the sensor registers via I2C/UART */
typedef int32_t (*xensiv_pasco2_write_fptr_t)(const struct xensiv_pasco2 * dev, uint8_t reg_addr, const uint8_t * data, uint8_t len);
typedef struct xensiv_pasco2
{
void * ctx;
xensiv_pasco2_read_fptr_t read;
xensiv_pasco2_write_fptr_t write;
} xensiv_pasco2_t;
/******************************* Function prototypes *************************************/
#ifdef __cplusplus
extern "C" {
#endif
int32_t xensiv_pasco2_init_i2c(xensiv_pasco2_t * dev, void *ctx);
int32_t xensiv_pasco2_init_uart(xensiv_pasco2_t * dev, void *ctx);
int32_t xensiv_pasco2_set_reg(const xensiv_pasco2_t * dev, uint8_t reg_addr, const uint8_t * data, uint8_t len);
int32_t xensiv_pasco2_get_reg(const xensiv_pasco2_t * dev, uint8_t reg_addr, uint8_t * data, uint8_t len);
int32_t xensiv_pasco2_get_id(const xensiv_pasco2_t * dev, xensiv_pasco2_id_t * id);
int32_t xensiv_pasco2_get_status(const xensiv_pasco2_t * dev, xensiv_pasco2_status_t * status);
int32_t xensiv_pasco2_clear_status(const xensiv_pasco2_t * dev, uint8_t mask);
int32_t xensiv_pasco2_get_interrupt_config(const xensiv_pasco2_t * dev, xensiv_pasco2_interrupt_config_t * int_config);
int32_t xensiv_pasco2_set_interrupt_config(const xensiv_pasco2_t * dev, xensiv_pasco2_interrupt_config_t int_config);
int32_t xensiv_pasco2_get_measurement_config(const xensiv_pasco2_t * dev, xensiv_pasco2_measurement_config_t * meas_config);
int32_t xensiv_pasco2_set_measurement_config(const xensiv_pasco2_t * dev, xensiv_pasco2_measurement_config_t meas_config);
int32_t xensiv_pasco2_get_result(const xensiv_pasco2_t * dev, uint16_t * val);
int32_t xensiv_pasco2_set_measurement_rate(const xensiv_pasco2_t * dev, uint16_t val);
int32_t xensiv_pasco2_get_measurement_status(const xensiv_pasco2_t * dev, xensiv_pasco2_meas_status_t * status);
int32_t xensiv_pasco2_clear_measurement_status(const xensiv_pasco2_t * dev, uint8_t mask);
int32_t xensiv_pasco2_set_alarm_threshold(const xensiv_pasco2_t * dev, uint16_t val);
int32_t xensiv_pasco2_set_pressure_compensation(const xensiv_pasco2_t * dev, uint16_t val);
int32_t xensiv_pasco2_set_offset_compensation(const xensiv_pasco2_t * dev, uint16_t val);
int32_t xensiv_pasco2_set_scratch_pad(const xensiv_pasco2_t * dev, uint8_t val);
int32_t xensiv_pasco2_get_scratch_pad(const xensiv_pasco2_t * dev, uint8_t * val);
int32_t xensiv_pasco2_cmd(const xensiv_pasco2_t * dev, xensiv_pasco2_cmd_t cmd);
int32_t xensiv_pasco2_start_single_mode(const xensiv_pasco2_t * dev);
int32_t xensiv_pasco2_start_continuous_mode(const xensiv_pasco2_t * dev, uint16_t val);
int32_t xensiv_pasco2_perform_forced_compensation(const xensiv_pasco2_t * dev, uint16_t co2_ref);
int32_t xensiv_pasco2_plat_i2c_transfer(void * ctx, uint16_t dev_addr, const uint8_t * tx_buffer, size_t tx_len, uint8_t * rx_buffer, size_t rx_len);
int32_t xensiv_pasco2_plat_uart_read(void *ctx, uint8_t * data, size_t len);
int32_t xensiv_pasco2_plat_uart_write(void *ctx, uint8_t * data, size_t len);
void xensiv_pasco2_plat_delay(uint32_t ms);
uint16_t xensiv_pasco2_plat_htons(uint16_t x);
void xensiv_pasco2_plat_assert(int expr);
#ifdef __cplusplus
}
#endif
#endif