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