/**
* Copyright (c) 2020 Bosch Sensortec GmbH. All rights reserved.
*
* BSD-3-Clause
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright
*    notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
*    notice, this list of conditions and the following disclaimer in the
*    documentation and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its
*    contributors may be used to endorse or promote products derived from
*    this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @file       bmp3_defs.h
* @date       2021-06-17
* @version    v2.0.5
*
*/

/*! @file bmp3_defs.h
 * @brief Sensor driver for BMP3 sensor */

#ifndef BMP3_DEFS_H_
#define BMP3_DEFS_H_

/*! CPP guard */
#ifdef __cplusplus
extern "C" {
#endif

/********************************************************/
/* header includes */
#ifdef __KERNEL__
#include <linux/types.h>
#include <linux/kernel.h>
#else
#include <stdint.h>
#include <stddef.h>
#endif

/*************************** Common macros   *****************************/

#if !defined(UINT8_C) && !defined(INT8_C)
#define INT8_C(x)    S8_C(x)
#define UINT8_C(x)   U8_C(x)
#endif

#if !defined(UINT16_C) && !defined(INT16_C)
#define INT16_C(x)   S16_C(x)
#define UINT16_C(x)  U16_C(x)
#endif

#if !defined(INT32_C) && !defined(UINT32_C)
#define INT32_C(x)   S32_C(x)
#define UINT32_C(x)  U32_C(x)
#endif

#if !defined(INT64_C) && !defined(UINT64_C)
#define INT64_C(x)   S64_C(x)
#define UINT64_C(x)  U64_C(x)
#endif

/**@}*/
/**\name C standard macros */
#ifndef NULL
#ifdef __cplusplus
#define NULL         0
#else
#define NULL         ((void *) 0)
#endif
#endif

#ifndef TRUE
#define TRUE         UINT8_C(1)
#endif

#ifndef FALSE
#define FALSE        UINT8_C(0)
#endif

/********************************************************/
/**\name Compiler switch macros */

#ifndef BMP3_64BIT_COMPENSATION /*< Check if 64bit (using BMP3_64BIT_COMPENSATION) is enabled */
#ifndef BMP3_FLOAT_COMPENSATION /*< If 64 bit integer data type is not enabled then enable
                                            * BMP3_FLOAT_COMPENSATION */
// #define BMP3_FLOAT_COMPENSATION
#endif
#endif

/********************************************************/
/**\name Macro definitions */

/**
 * BMP3_INTF_RET_TYPE is the read/write interface return type which can be overwritten by the build system.
 */
#ifndef BMP3_INTF_RET_TYPE
#define BMP3_INTF_RET_TYPE                      int8_t
#endif

/**
 * The last error code from read/write interface is stored in the device structure as intf_rslt.
 */
#ifndef BMP3_INTF_RET_SUCCESS
#define BMP3_INTF_RET_SUCCESS                   INT8_C(0)
#endif

/**\name I2C addresses */
#define BMP3_ADDR_I2C_PRIM                      UINT8_C(0x76)
#define BMP3_ADDR_I2C_SEC                       UINT8_C(0x77)

/**\name BMP3 chip identifier */
#define BMP3_CHIP_ID                            UINT8_C(0x50)
#define BMP390_CHIP_ID                          UINT8_C(0x60)

/**\name BMP3 pressure settling time (micro secs)*/
#define BMP3_SETTLE_TIME_PRESS                  UINT16_C(392)

/**\name BMP3 temperature settling time (micro secs) */
#define BMP3_SETTLE_TIME_TEMP                   UINT16_C(313)

/**\name BMP3 adc conversion time (micro secs) */
#define BMP3_ADC_CONV_TIME                      UINT16_C(2000)

/**\name Register Address */
#define BMP3_REG_CHIP_ID                        UINT8_C(0x00)
#define BMP3_REG_ERR                            UINT8_C(0x02)
#define BMP3_REG_SENS_STATUS                    UINT8_C(0x03)
#define BMP3_REG_DATA                           UINT8_C(0x04)
#define BMP3_REG_EVENT                          UINT8_C(0x10)
#define BMP3_REG_INT_STATUS                     UINT8_C(0x11)
#define BMP3_REG_FIFO_LENGTH                    UINT8_C(0x12)
#define BMP3_REG_FIFO_DATA                      UINT8_C(0x14)
#define BMP3_REG_FIFO_WM                        UINT8_C(0x15)
#define BMP3_REG_FIFO_CONFIG_1                  UINT8_C(0x17)
#define BMP3_REG_FIFO_CONFIG_2                  UINT8_C(0x18)
#define BMP3_REG_INT_CTRL                       UINT8_C(0x19)
#define BMP3_REG_IF_CONF                        UINT8_C(0x1A)
#define BMP3_REG_PWR_CTRL                       UINT8_C(0x1B)
#define BMP3_REG_OSR                            UINT8_C(0X1C)
#define BMP3_REG_ODR                            UINT8_C(0x1D)
#define BMP3_REG_CONFIG                         UINT8_C(0x1F)
#define BMP3_REG_CALIB_DATA                     UINT8_C(0x31)
#define BMP3_REG_CMD                            UINT8_C(0x7E)

/**\name Error status macros */
#define BMP3_ERR_FATAL                          UINT8_C(0x01)
#define BMP3_ERR_CMD                            UINT8_C(0x02)
#define BMP3_ERR_CONF                           UINT8_C(0x04)

/**\name Status macros */
#define BMP3_CMD_RDY                            UINT8_C(0x10)
#define BMP3_DRDY_PRESS                         UINT8_C(0x20)
#define BMP3_DRDY_TEMP                          UINT8_C(0x40)

/**\name Power mode macros */
#define BMP3_MODE_SLEEP                         UINT8_C(0x00)
#define BMP3_MODE_FORCED                        UINT8_C(0x01)
#define BMP3_MODE_NORMAL                        UINT8_C(0x03)

/**\name FIFO related macros */
/**\name FIFO enable  */
#define BMP3_ENABLE                             UINT8_C(0x01)
#define BMP3_DISABLE                            UINT8_C(0x00)

/**\name Interrupt pin configuration macros */
/**\name Open drain */
#define BMP3_INT_PIN_OPEN_DRAIN                 UINT8_C(0x01)
#define BMP3_INT_PIN_PUSH_PULL                  UINT8_C(0x00)

/**\name Level */
#define BMP3_INT_PIN_ACTIVE_HIGH                UINT8_C(0x01)
#define BMP3_INT_PIN_ACTIVE_LOW                 UINT8_C(0x00)

/**\name Latch */
#define BMP3_INT_PIN_LATCH                      UINT8_C(0x01)
#define BMP3_INT_PIN_NON_LATCH                  UINT8_C(0x00)

/**\name Advance settings  */
/**\name I2c watch dog timer period selection */
#define BMP3_I2C_WDT_SHORT_1_25_MS              UINT8_C(0x00)
#define BMP3_I2C_WDT_LONG_40_MS                 UINT8_C(0x01)

/**\name FIFO Sub-sampling macros */
#define BMP3_FIFO_NO_SUBSAMPLING                UINT8_C(0x00)
#define BMP3_FIFO_SUBSAMPLING_2X                UINT8_C(0x01)
#define BMP3_FIFO_SUBSAMPLING_4X                UINT8_C(0x02)
#define BMP3_FIFO_SUBSAMPLING_8X                UINT8_C(0x03)
#define BMP3_FIFO_SUBSAMPLING_16X               UINT8_C(0x04)
#define BMP3_FIFO_SUBSAMPLING_32X               UINT8_C(0x05)
#define BMP3_FIFO_SUBSAMPLING_64X               UINT8_C(0x06)
#define BMP3_FIFO_SUBSAMPLING_128X              UINT8_C(0x07)

/**\name Over sampling macros */
#define BMP3_NO_OVERSAMPLING                    UINT8_C(0x00)
#define BMP3_OVERSAMPLING_2X                    UINT8_C(0x01)
#define BMP3_OVERSAMPLING_4X                    UINT8_C(0x02)
#define BMP3_OVERSAMPLING_8X                    UINT8_C(0x03)
#define BMP3_OVERSAMPLING_16X                   UINT8_C(0x04)
#define BMP3_OVERSAMPLING_32X                   UINT8_C(0x05)

/**\name Filter setting macros */
#define BMP3_IIR_FILTER_DISABLE                 UINT8_C(0x00)
#define BMP3_IIR_FILTER_COEFF_1                 UINT8_C(0x01)
#define BMP3_IIR_FILTER_COEFF_3                 UINT8_C(0x02)
#define BMP3_IIR_FILTER_COEFF_7                 UINT8_C(0x03)
#define BMP3_IIR_FILTER_COEFF_15                UINT8_C(0x04)
#define BMP3_IIR_FILTER_COEFF_31                UINT8_C(0x05)
#define BMP3_IIR_FILTER_COEFF_63                UINT8_C(0x06)
#define BMP3_IIR_FILTER_COEFF_127               UINT8_C(0x07)

/**\name Odr setting macros */
#define BMP3_ODR_200_HZ                         UINT8_C(0x00)
#define BMP3_ODR_100_HZ                         UINT8_C(0x01)
#define BMP3_ODR_50_HZ                          UINT8_C(0x02)
#define BMP3_ODR_25_HZ                          UINT8_C(0x03)
#define BMP3_ODR_12_5_HZ                        UINT8_C(0x04)
#define BMP3_ODR_6_25_HZ                        UINT8_C(0x05)
#define BMP3_ODR_3_1_HZ                         UINT8_C(0x06)
#define BMP3_ODR_1_5_HZ                         UINT8_C(0x07)
#define BMP3_ODR_0_78_HZ                        UINT8_C(0x08)
#define BMP3_ODR_0_39_HZ                        UINT8_C(0x09)
#define BMP3_ODR_0_2_HZ                         UINT8_C(0x0A)
#define BMP3_ODR_0_1_HZ                         UINT8_C(0x0B)
#define BMP3_ODR_0_05_HZ                        UINT8_C(0x0C)
#define BMP3_ODR_0_02_HZ                        UINT8_C(0x0D)
#define BMP3_ODR_0_01_HZ                        UINT8_C(0x0E)
#define BMP3_ODR_0_006_HZ                       UINT8_C(0x0F)
#define BMP3_ODR_0_003_HZ                       UINT8_C(0x10)
#define BMP3_ODR_0_001_HZ                       UINT8_C(0x11)

/**\name Soft reset command */
#define BMP3_SOFT_RESET                         UINT8_C(0xB6)

/**\name FIFO flush command */
#define BMP3_FIFO_FLUSH                         UINT8_C(0xB0)

/**\name API success code */
#define BMP3_OK                                 INT8_C(0)

/**\name API error codes */
#define BMP3_E_NULL_PTR                         INT8_C(-1)// Invalid input parameters
#define BMP3_E_COMM_FAIL                        INT8_C(-2)// Communication error
#define BMP3_E_INVALID_ODR_OSR_SETTINGS         INT8_C(-3)// Invalid odr or over sampling settings
#define BMP3_E_CMD_EXEC_FAILED                  INT8_C(-4)// Command execution failed
#define BMP3_E_CONFIGURATION_ERR                INT8_C(-5)// Invalid configuration
#define BMP3_E_INVALID_LEN                      INT8_C(-6)// Invalid length
#define BMP3_E_DEV_NOT_FOUND                    INT8_C(-7)// Device not found
#define BMP3_E_FIFO_WATERMARK_NOT_REACHED       INT8_C(-8)// FIFO watermark not reached

/**\name API warning codes */
#define BMP3_W_SENSOR_NOT_ENABLED               INT8_C(1)
#define BMP3_W_INVALID_FIFO_REQ_FRAME_CNT       INT8_C(2)
#define BMP3_W_MIN_TEMP                         INT8_C(3)
#define BMP3_W_MAX_TEMP                         INT8_C(4)
#define BMP3_W_MIN_PRES                         INT8_C(5)
#define BMP3_W_MAX_PRES                         INT8_C(6)

/**\name Macros to select the which sensor settings are to be set by the user.
 * These values are internal for API implementation. Don't relate this to
 * data sheet. */
#define BMP3_SEL_PRESS_EN                       UINT16_C(1 << 1)
#define BMP3_SEL_TEMP_EN                        UINT16_C(1 << 2)
#define BMP3_SEL_DRDY_EN                        UINT16_C(1 << 3)
#define BMP3_SEL_PRESS_OS                       UINT16_C(1 << 4)
#define BMP3_SEL_TEMP_OS                        UINT16_C(1 << 5)
#define BMP3_SEL_IIR_FILTER                     UINT16_C(1 << 6)
#define BMP3_SEL_ODR                            UINT16_C(1 << 7)
#define BMP3_SEL_OUTPUT_MODE                    UINT16_C(1 << 8)
#define BMP3_SEL_LEVEL                          UINT16_C(1 << 9)
#define BMP3_SEL_LATCH                          UINT16_C(1 << 10)
#define BMP3_SEL_I2C_WDT_EN                     UINT16_C(1 << 11)
#define BMP3_SEL_I2C_WDT                        UINT16_C(1 << 12)
#define BMP3_SEL_ALL                            UINT16_C(0x7FF)

/**\name Macros to select the which FIFO settings are to be set by the user
 * These values are internal for API implementation. Don't relate this to
 * data sheet.*/
#define BMP3_SEL_FIFO_MODE                      UINT16_C(1 << 1)
#define BMP3_SEL_FIFO_STOP_ON_FULL_EN           UINT16_C(1 << 2)
#define BMP3_SEL_FIFO_TIME_EN                   UINT16_C(1 << 3)
#define BMP3_SEL_FIFO_PRESS_EN                  UINT16_C(1 << 4)
#define BMP3_SEL_FIFO_TEMP_EN                   UINT16_C(1 << 5)
#define BMP3_SEL_FIFO_DOWN_SAMPLING             UINT16_C(1 << 6)
#define BMP3_SEL_FIFO_FILTER_EN                 UINT16_C(1 << 7)
#define BMP3_SEL_FIFO_FWTM_EN                   UINT16_C(1 << 8)
#define BMP3_SEL_FIFO_FULL_EN                   UINT16_C(1 << 9)

/**\name Sensor component selection macros
 * These values are internal for API implementation. Don't relate this to
 * data sheet.*/
#define BMP3_PRESS                              UINT8_C(1)
#define BMP3_TEMP                               UINT8_C(2)
#define BMP3_PRESS_TEMP                         UINT8_C(3)

/**\name Temperature range values in integer and float */
#define BMP3_MIN_TEMP_INT                       INT64_C(-4000)
#define BMP3_MAX_TEMP_INT                       INT64_C(8500)
#define BMP3_MIN_TEMP_DOUBLE                    -40.0f
#define BMP3_MAX_TEMP_DOUBLE                    85.0f

/**\name Pressure range values in integer and float */
#define BMP3_MIN_PRES_INT                       UINT64_C(3000000)
#define BMP3_MAX_PRES_INT                       UINT64_C(12500000)
#define BMP3_MIN_PRES_DOUBLE                    30000.0f
#define BMP3_MAX_PRES_DOUBLE                    125000.0f

/**\name Macros for bit masking */
#define BMP3_ERR_FATAL_MSK                      UINT8_C(0x01)

#define BMP3_ERR_CMD_MSK                        UINT8_C(0x02)
#define BMP3_ERR_CMD_POS                        UINT8_C(0x01)

#define BMP3_ERR_CONF_MSK                       UINT8_C(0x04)
#define BMP3_ERR_CONF_POS                       UINT8_C(0x02)

#define BMP3_STATUS_CMD_RDY_MSK                 UINT8_C(0x10)
#define BMP3_STATUS_CMD_RDY_POS                 UINT8_C(0x04)

#define BMP3_STATUS_DRDY_PRESS_MSK              UINT8_C(0x20)
#define BMP3_STATUS_DRDY_PRESS_POS              UINT8_C(0x05)

#define BMP3_STATUS_DRDY_TEMP_MSK               UINT8_C(0x40)
#define BMP3_STATUS_DRDY_TEMP_POS               UINT8_C(0x06)

#define BMP3_OP_MODE_MSK                        UINT8_C(0x30)
#define BMP3_OP_MODE_POS                        UINT8_C(0x04)

#define BMP3_PRESS_EN_MSK                       UINT8_C(0x01)

#define BMP3_TEMP_EN_MSK                        UINT8_C(0x02)
#define BMP3_TEMP_EN_POS                        UINT8_C(0x01)

#define BMP3_IIR_FILTER_MSK                     UINT8_C(0x0E)
#define BMP3_IIR_FILTER_POS                     UINT8_C(0x01)

#define BMP3_ODR_MSK                            UINT8_C(0x1F)

#define BMP3_PRESS_OS_MSK                       UINT8_C(0x07)

#define BMP3_TEMP_OS_MSK                        UINT8_C(0x38)
#define BMP3_TEMP_OS_POS                        UINT8_C(0x03)

#define BMP3_FIFO_MODE_MSK                      UINT8_C(0x01)

#define BMP3_FIFO_STOP_ON_FULL_MSK              UINT8_C(0x02)
#define BMP3_FIFO_STOP_ON_FULL_POS              UINT8_C(0x01)

#define BMP3_FIFO_TIME_EN_MSK                   UINT8_C(0x04)
#define BMP3_FIFO_TIME_EN_POS                   UINT8_C(0x02)

#define BMP3_FIFO_PRESS_EN_MSK                  UINT8_C(0x08)
#define BMP3_FIFO_PRESS_EN_POS                  UINT8_C(0x03)

#define BMP3_FIFO_TEMP_EN_MSK                   UINT8_C(0x10)
#define BMP3_FIFO_TEMP_EN_POS                   UINT8_C(0x04)

#define BMP3_FIFO_FILTER_EN_MSK                 UINT8_C(0x18)
#define BMP3_FIFO_FILTER_EN_POS                 UINT8_C(0x03)

#define BMP3_FIFO_DOWN_SAMPLING_MSK             UINT8_C(0x07)

#define BMP3_FIFO_FWTM_EN_MSK                   UINT8_C(0x08)
#define BMP3_FIFO_FWTM_EN_POS                   UINT8_C(0x03)

#define BMP3_FIFO_FULL_EN_MSK                   UINT8_C(0x10)
#define BMP3_FIFO_FULL_EN_POS                   UINT8_C(0x04)

#define BMP3_INT_OUTPUT_MODE_MSK                UINT8_C(0x01)

#define BMP3_INT_LEVEL_MSK                      UINT8_C(0x02)
#define BMP3_INT_LEVEL_POS                      UINT8_C(0x01)

#define BMP3_INT_LATCH_MSK                      UINT8_C(0x04)
#define BMP3_INT_LATCH_POS                      UINT8_C(0x02)

#define BMP3_INT_DRDY_EN_MSK                    UINT8_C(0x40)
#define BMP3_INT_DRDY_EN_POS                    UINT8_C(0x06)

#define BMP3_I2C_WDT_EN_MSK                     UINT8_C(0x02)
#define BMP3_I2C_WDT_EN_POS                     UINT8_C(0x01)

#define BMP3_I2C_WDT_SEL_MSK                    UINT8_C(0x04)
#define BMP3_I2C_WDT_SEL_POS                    UINT8_C(0x02)

#define BMP3_INT_STATUS_FWTM_MSK                UINT8_C(0x01)

#define BMP3_INT_STATUS_FFULL_MSK               UINT8_C(0x02)
#define BMP3_INT_STATUS_FFULL_POS               UINT8_C(0x01)

#define BMP3_INT_STATUS_DRDY_MSK                UINT8_C(0x08)
#define BMP3_INT_STATUS_DRDY_POS                UINT8_C(0x03)

/**\name    UTILITY MACROS  */
#define BMP3_SET_LOW_BYTE                       UINT16_C(0x00FF)
#define BMP3_SET_HIGH_BYTE                      UINT16_C(0xFF00)

/**\name Macro to combine two 8 bit data's to form a 16 bit data */
#define BMP3_CONCAT_BYTES(msb, lsb)             (((uint16_t)msb << 8) | (uint16_t)lsb)

#define BMP3_SET_BITS(reg_data, bitname, data) \
    ((reg_data & ~(bitname##_MSK)) | \
     ((data << bitname##_POS) & bitname##_MSK))

/* Macro variant to handle the bitname position if it is zero */
#define BMP3_SET_BITS_POS_0(reg_data, bitname, data) \
    ((reg_data & ~(bitname##_MSK)) | \
     (data & bitname##_MSK))

#define BMP3_GET_BITS(reg_data, bitname)        ((reg_data & (bitname##_MSK)) >> \
                                                 (bitname##_POS))

/* Macro variant to handle the bitname position if it is zero */
#define BMP3_GET_BITS_POS_0(reg_data, bitname)  (reg_data & (bitname##_MSK))

#define BMP3_GET_LSB(var)                       (uint8_t)(var & BMP3_SET_LOW_BYTE)
#define BMP3_GET_MSB(var)                       (uint8_t)((var & BMP3_SET_HIGH_BYTE) >> 8)

/**\name Macros related to size */
#define BMP3_LEN_CALIB_DATA                     UINT8_C(21)
#define BMP3_LEN_P_AND_T_HEADER_DATA            UINT8_C(7)
#define BMP3_LEN_P_OR_T_HEADER_DATA             UINT8_C(4)
#define BMP3_LEN_P_T_DATA                       UINT8_C(6)
#define BMP3_LEN_GEN_SETT                       UINT8_C(7)
#define BMP3_LEN_P_DATA                         UINT8_C(3)
#define BMP3_LEN_T_DATA                         UINT8_C(3)
#define BMP3_LEN_SENSOR_TIME                    UINT8_C(3)
#define BMP3_FIFO_MAX_FRAMES                    UINT8_C(73)

/*! Power control settings */
#define BMP3_POWER_CNTL                         UINT16_C(0x0006)

/*! Odr and filter settings */
#define BMP3_ODR_FILTER                         UINT16_C(0x00F0)

/*! Interrupt control settings */
#define BMP3_INT_CTRL                           UINT16_C(0x0708)

/*! Advance settings */
#define BMP3_ADV_SETT                           UINT16_C(0x1800)

/*! FIFO settings */

/*! Mask for fifo_mode, fifo_stop_on_full, fifo_time_en, fifo_press_en and
 * fifo_temp_en settings */
#define BMP3_FIFO_CONFIG_1                      UINT16_C(0x003E)

/*! Mask for fifo_sub_sampling and data_select settings */
#define BMP3_FIFO_CONFIG_2                      UINT16_C(0x00C0)

/*! Mask for fwtm_en and ffull_en settings */
#define BMP3_FIFO_INT_CTRL                      UINT16_C(0x0300)

/*! FIFO Header */
/*! FIFO temperature pressure header frame */
#define BMP3_FIFO_TEMP_PRESS_FRAME              UINT8_C(0x94)

/*! FIFO temperature header frame */
#define BMP3_FIFO_TEMP_FRAME                    UINT8_C(0x90)

/*! FIFO pressure header frame */
#define BMP3_FIFO_PRESS_FRAME                   UINT8_C(0x84)

/*! FIFO time header frame */
#define BMP3_FIFO_TIME_FRAME                    UINT8_C(0xA0)

/*! FIFO error header frame */
#define BMP3_FIFO_ERROR_FRAME                   UINT8_C(0x44)

/*! FIFO configuration change header frame */
#define BMP3_FIFO_CONFIG_CHANGE                 UINT8_C(0x48)

/*! FIFO empty frame */
#define BMP3_FIFO_EMPTY_FRAME                   UINT8_C(0x80)

/*! FIFO sensortime overhead byte count */
#define BMP3_SENSORTIME_OVERHEAD_BYTES          UINT8_C(20)

/********************************************************/

/*!
 * @brief Interface selection Enums
 */
enum bmp3_intf {
    /*! SPI interface */
    BMP3_SPI_INTF,
    /*! I2C interface */
    BMP3_I2C_INTF
};

/********************************************************/

/*!
 * @brief Type definitions
 */

/*!
 * @brief Bus communication function pointer which should be mapped to
 * the platform specific read functions of the user
 *
 * @param[in]     reg_addr : 8bit register address of the sensor
 * @param[out]    reg_data : Data from the specified address
 * @param[in]     length   : Length of the reg_data array
 * @param[in,out] intf_ptr : Void pointer that can enable the linking of descriptors
 *                           for interface related callbacks
 * @retval 0 for Success
 * @retval Non-zero for Failure
 */
typedef BMP3_INTF_RET_TYPE (*bmp3_read_fptr_t)(uint8_t reg_addr, uint8_t *read_data, uint32_t len, void *intf_ptr);

/*!
 * @brief Bus communication function pointer which should be mapped to
 * the platform specific write functions of the user
 *
 * @param[in]     reg_addr : 8bit register address of the sensor
 * @param[out]    reg_data : Data to the specified address
 * @param[in]     length   : Length of the reg_data array
 * @param[in,out] intf_ptr : Void pointer that can enable the linking of descriptors
 *                           for interface related callbacks
 * @retval 0 for Success
 * @retval Non-zero for Failure
 *
 */
typedef BMP3_INTF_RET_TYPE (*bmp3_write_fptr_t)(uint8_t reg_addr, const uint8_t *read_data, uint32_t len,
                                                void *intf_ptr);

/*!
 * @brief Delay function pointer which should be mapped to
 * delay function of the user
 *
 * @param[in] period              : Delay in microseconds.
 * @param[in, out] intf_ptr       : Void pointer that can enable the linking of descriptors
 *                                  for interface related call backs
 *
 */
typedef void (*bmp3_delay_us_fptr_t)(uint32_t period, void *intf_ptr);

/********************************************************/

/*!
 * @brief Register Trim Variables
 */
struct bmp3_reg_calib_data
{
    /*! Trim Variables */

    uint16_t par_t1;
    uint16_t par_t2;
    int8_t par_t3;
    int16_t par_p1;
    int16_t par_p2;
    int8_t par_p3;
    int8_t par_p4;
    uint16_t par_p5;
    uint16_t par_p6;
    int8_t par_p7;
    int8_t par_p8;
    int16_t par_p9;
    int8_t par_p10;
    int8_t par_p11;
    int64_t t_lin;
};

/*!
 * @brief bmp3 advance settings
 */
struct bmp3_adv_settings
{
    /*! I2C watchdog enable */
    uint8_t i2c_wdt_en;

    /*! I2C watchdog select */
    uint8_t i2c_wdt_sel;
};

/*!
 * @brief bmp3 odr and filter settings
 */
struct bmp3_odr_filter_settings
{
    /*! Pressure oversampling */
    uint8_t press_os;

    /*! Temperature oversampling */
    uint8_t temp_os;

    /*! IIR filter */
    uint8_t iir_filter;

    /*! Output data rate */
    uint8_t odr;
};

/*!
 * @brief bmp3 sensor status flags
 */
struct bmp3_sens_status
{
    /*! Command ready status */
    uint8_t cmd_rdy;

    /*! Data ready for pressure */
    uint8_t drdy_press;

    /*! Data ready for temperature */
    uint8_t drdy_temp;
};

/*!
 * @brief bmp3 interrupt status flags
 */
struct bmp3_int_status
{
    /*! Fifo watermark interrupt */
    uint8_t fifo_wm;

    /*! Fifo full interrupt */
    uint8_t fifo_full;

    /*! Data ready interrupt */
    uint8_t drdy;
};

/*!
 * @brief bmp3 error status flags
 */
struct bmp3_err_status
{
    /*! Fatal error */
    uint8_t fatal;

    /*! Command error */
    uint8_t cmd;

    /*! Configuration error */
    uint8_t conf;
};

/*!
 * @brief bmp3 status flags
 */
struct bmp3_status
{
    /*! Interrupt status */
    struct bmp3_int_status intr;

    /*! Sensor status */
    struct bmp3_sens_status sensor;

    /*! Error status */
    struct bmp3_err_status err;

    /*! Power on reset status */
    uint8_t pwr_on_rst;
};

/*!
 * @brief bmp3 interrupt pin settings
 */
struct bmp3_int_ctrl_settings
{
    /*! Output mode */
    uint8_t output_mode;

    /*! Active high/low */
    uint8_t level;

    /*! Latched or Non-latched */
    uint8_t latch;

    /*! Data ready interrupt */
    uint8_t drdy_en;
};

/*!
 * @brief bmp3 device settings
 */
struct bmp3_settings
{
    /*! Power mode which user wants to set */
    uint8_t op_mode;

    /*! Enable/Disable pressure sensor */
    uint8_t press_en;

    /*! Enable/Disable temperature sensor */
    uint8_t temp_en;

    /*! ODR and filter configuration */
    struct bmp3_odr_filter_settings odr_filter;

    /*! Interrupt configuration */
    struct bmp3_int_ctrl_settings int_settings;

    /*! Advance settings */
    struct bmp3_adv_settings adv_settings;
};

/*!
 * @brief bmp3 fifo frame
 */
struct bmp3_fifo_data
{
    /*! Data buffer of user defined length is to be mapped here
     * 512 + 4 */
    uint8_t *buffer;

    /*! Number of bytes of data read from the fifo */
    uint16_t byte_count;

    /*! Number of frames to be read as specified by the user */
    uint8_t req_frames;

    /*! Will be equal to length when no more frames are there to parse */
    uint16_t start_idx;

    /*! Will contain the no of parsed data frames from fifo */
    uint8_t parsed_frames;

    /*! Configuration error */
    uint8_t config_err;

    /*! Sensor time */
    uint32_t sensor_time;

    /*! FIFO input configuration change */
    uint8_t config_change;

    /*! All available frames are parsed */
    uint8_t frame_not_available;
};

/*!
 * @brief bmp3 fifo configuration
 */
struct bmp3_fifo_settings
{
    /*! enable/disable */
    uint8_t mode;

    /*! stop on full enable/disable */
    uint8_t stop_on_full_en;

    /*! time enable/disable */
    uint8_t time_en;

    /*! pressure enable/disable */
    uint8_t press_en;

    /*! temperature enable/disable */
    uint8_t temp_en;

    /*! down sampling rate */
    uint8_t down_sampling;

    /*! filter enable/disable */
    uint8_t filter_en;

    /*! FIFO watermark enable/disable */
    uint8_t fwtm_en;

    /*! FIFO full enable/disable */
    uint8_t ffull_en;
};

#ifdef BMP3_FLOAT_COMPENSATION

/*!
 * @brief Quantized Trim Variables
 */
struct bmp3_quantized_calib_data
{
    /*! Quantized Trim Variables */

    double par_t1;
    double par_t2;
    double par_t3;
    double par_p1;
    double par_p2;
    double par_p3;
    double par_p4;
    double par_p5;
    double par_p6;
    double par_p7;
    double par_p8;
    double par_p9;
    double par_p10;
    double par_p11;
    double t_lin;
};

/*!
 * @brief Calibration data
 */
struct bmp3_calib_data
{
    /*! Quantized data */
    struct bmp3_quantized_calib_data quantized_calib_data;

    /*! Register data */
    struct bmp3_reg_calib_data reg_calib_data;
};

/*!
 * @brief bmp3 sensor structure which comprises of temperature and pressure
 * data.
 */
struct bmp3_data
{
    /*! Compensated temperature */
    double temperature;

    /*! Compensated pressure */
    double pressure;
};

#else

/*!
 * @brief bmp3 sensor structure which comprises of temperature and pressure
 * data.
 */
struct bmp3_data
{
    /*! Compensated temperature */
    int64_t temperature;

    /*! Compensated pressure */
    uint64_t pressure;
};

/*!
 * @brief Calibration data
 */
struct bmp3_calib_data
{
    /*! Register data */
    struct bmp3_reg_calib_data reg_calib_data;
};

#endif /* BMP3_FLOAT_COMPENSATION */

/*!
 * @brief bmp3 sensor structure which comprises of un-compensated temperature
 * and pressure data.
 */
struct bmp3_uncomp_data
{
    /*! un-compensated pressure */
    uint64_t pressure;

    /*! un-compensated temperature */
    int64_t temperature;
};

/*!
 * @brief bmp3 device structure
 */
struct bmp3_dev
{
    /*! Chip Id */
    uint8_t chip_id;

    /*!
     * The interface pointer is used to enable the user
     * to link their interface descriptors for reference during the
     * implementation of the read and write interfaces to the
     * hardware.
     */
    void *intf_ptr;

    /*! Interface Selection
     * For SPI, interface = BMP3_SPI_INTF
     * For I2C, interface = BMP3_I2C_INTF
     **/
    enum bmp3_intf intf;

    /*! To store interface pointer error */
    BMP3_INTF_RET_TYPE intf_rslt;

    /*! Decide SPI or I2C read mechanism */
    uint8_t dummy_byte;

    /*! Read function pointer */
    bmp3_read_fptr_t read;

    /*! Write function pointer */
    bmp3_write_fptr_t write;

    /*! Delay function pointer */
    bmp3_delay_us_fptr_t delay_us;

    /*! Trim data */
    struct bmp3_calib_data calib_data;
};

#ifdef __cplusplus
}
#endif /* End of CPP guard */

#endif /* BMP3_DEFS_H_ */
