/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

#include <assert.h>
#include <string.h>
#include "os/mynewt.h"

#if MYNEWT_VAL(DRV2605_OFB)
#include "hal/hal_gpio.h"
#include <drv2605/drv2605.h>
#endif
#if MYNEWT_VAL(LSM303DLHC_OFB)
#include <lsm303dlhc/lsm303dlhc.h>
#endif
#if MYNEWT_VAL(MPU6050_OFB)
#include <mpu6050/mpu6050.h>
#endif
#if MYNEWT_VAL(BNO055_OFB)
#include <bno055/bno055.h>
#endif
#if MYNEWT_VAL(TSL2561_OFB)
#include <tsl2561/tsl2561.h>
#endif
#if MYNEWT_VAL(TSL2591_OFB)
#include <tsl2591/tsl2591.h>
#endif
#if MYNEWT_VAL(TCS34725_OFB)
#include <tcs34725/tcs34725.h>
#endif
#if MYNEWT_VAL(BME280_OFB)
#include <bme280/bme280.h>
#endif

#if MYNEWT_VAL(MS5837_OFB)
#include <ms5837/ms5837.h>
#endif

#if MYNEWT_VAL(MS5840_OFB)
#include <ms5840/ms5840.h>
#endif

#if MYNEWT_VAL(BMP280_OFB)
#include <bmp280/bmp280.h>
#endif

#if MYNEWT_VAL(BMA253_OFB)
#include <bma253/bma253.h>
#endif

#if MYNEWT_VAL(BMA2XX_OFB)
#include <bma2xx/bma2xx.h>
#endif


#if MYNEWT_VAL(ADXL345_OFB)
#include <adxl345/adxl345.h>
#endif

#if MYNEWT_VAL(LPS33HW_OFB)
#include <lps33hw/lps33hw.h>
#endif

#if MYNEWT_VAL(LPS33THW_OFB)
#include <lps33thw/lps33thw.h>
#endif

#if MYNEWT_VAL(LIS2DW12_OFB)
#include <lis2dw12/lis2dw12.h>
#endif

#if MYNEWT_VAL(LIS2DS12_OFB)
#include <lis2ds12/lis2ds12.h>
#endif

/* Driver definitions */
#if MYNEWT_VAL(DRV2605_OFB)
static struct drv2605 drv2605;
#endif

#if MYNEWT_VAL(LSM303DLHC_OFB)
static struct lsm303dlhc lsm303dlhc;
#endif

#if MYNEWT_VAL(MPU6050_OFB)
static struct mpu6050 mpu6050;
#endif

#if MYNEWT_VAL(BNO055_OFB)
static struct bno055 bno055;
#endif

#if MYNEWT_VAL(TSL2561_OFB)
static struct tsl2561 tsl2561;
#endif

#if MYNEWT_VAL(TSL2591_OFB)
static struct tsl2591 tsl2591;
#endif

#if MYNEWT_VAL(TCS34725_OFB)
static struct tcs34725 tcs34725;
#endif

#if MYNEWT_VAL(BME280_OFB)
static struct bme280 bme280;
#endif

#if MYNEWT_VAL(MS5837_OFB)
static struct ms5837 ms5837;
#endif

#if MYNEWT_VAL(MS5840_OFB)
static struct ms5840 ms5840;
#endif

#if MYNEWT_VAL(BMP280_OFB)
static struct bmp280 bmp280;
#endif

#if MYNEWT_VAL(BMA253_OFB)
static struct bma253 bma253;
#endif

#if MYNEWT_VAL(BMA2XX_OFB)
static struct bma2xx bma2xx;
#endif

#if MYNEWT_VAL(ADXL345_OFB)
static struct adxl345 adxl345;
#endif

#if MYNEWT_VAL(LPS33HW_OFB)
static struct lps33hw lps33hw;
#endif

#if MYNEWT_VAL(LPS33THW_OFB)
static struct lps33thw lps33thw;
#endif

#if MYNEWT_VAL(LIS2DW12_OFB)
static struct lis2dw12 lis2dw12;
#endif

#if MYNEWT_VAL(LIS2DS12_OFB)
static struct lis2ds12 lis2ds12;
#endif

/**
 * If a UART sensor needs to be created, interface is defined in
 * the following way
 *
 * #if MYNEWT_VAL(UART_0)
 * static const struct sensor_itf uart_0_itf = {
 *   .si_type = SENSOR_ITF_UART,
 *   .si_num = 0,
 * };
 * #endif
 *
 * #if MYNEWT_VAL(UART_1)
 * static struct sensor_itf uart_1_itf = {
 *    .si_type = SENSOR_ITF_UART,
 *    .si_num = 1,
 *};
 *#endif
 */

#if MYNEWT_VAL(I2C_0) && MYNEWT_VAL(BMP280_OFB)
static struct sensor_itf i2c_0_itf_bmp = {
    .si_type = SENSOR_ITF_I2C,
    .si_num = 0,
    .si_addr = BMP280_DFLT_I2C_ADDR
};
#endif

#if MYNEWT_VAL(SPI_0_MASTER) && MYNEWT_VAL(BME280_OFB)
static struct sensor_itf spi_0_itf_bme = {
    .si_type = SENSOR_ITF_SPI,
    .si_num = 0,
    .si_cs_pin = 3
};
#endif

#if MYNEWT_VAL(I2C_0) && MYNEWT_VAL(DRV2605_OFB)
static struct sensor_itf i2c_0_itf_drv = {
    .si_type = SENSOR_ITF_I2C,
    .si_num  = 0,
    .si_addr = MYNEWT_VAL(DRV2605_SHELL_ITF_ADDR),
    .si_cs_pin = MYNEWT_VAL(DRV2605_EN_PIN)
};
#endif

#if MYNEWT_VAL(I2C_0) && MYNEWT_VAL(LSM303DLHC_OFB)
static struct sensor_itf i2c_0_itf_lsm = {
    .si_type = SENSOR_ITF_I2C,
    .si_num  = 0,
    .si_addr = 0
};
#endif

#if MYNEWT_VAL(I2C_0) && MYNEWT_VAL(MPU6050_OFB)
static struct sensor_itf i2c_0_itf_mpu = {
    .si_type = SENSOR_ITF_I2C,
    .si_num  = 0,
    .si_addr = MPU6050_I2C_ADDR
};
#endif

#if MYNEWT_VAL(I2C_0) && MYNEWT_VAL(BNO055_OFB)
static struct sensor_itf i2c_0_itf_bno = {
    .si_type = SENSOR_ITF_I2C,
    .si_num  = 0,
    /* HW I2C address for the BNO055 */
    .si_addr = 0x28
};
#endif

#if MYNEWT_VAL(I2C_0) && MYNEWT_VAL(TSL2561_OFB)
static struct sensor_itf i2c_0_itf_tsl = {
    .si_type = SENSOR_ITF_I2C,
    .si_num  = 0,
    /*  I2C address for the TSL2561 (0x29, 0x39 or 0x49) */
    .si_addr = 0x39
};
#endif

#if MYNEWT_VAL(I2C_0) && MYNEWT_VAL(TSL2591_OFB)
static struct sensor_itf i2c_0_itf_tsl = {
    .si_type = SENSOR_ITF_I2C,
    .si_num  = 0,
    /*  I2C address for the TSL2591 (0x29) */
    .si_addr = 0x29
};
#endif

#if MYNEWT_VAL(I2C_0) && MYNEWT_VAL(TCS34725_OFB)
static struct sensor_itf i2c_0_itf_tcs = {
    .si_type = SENSOR_ITF_I2C,
    .si_num  = 0,
    /* HW I2C address for the TCS34725 */
    .si_addr = 0x29
};
#endif

#if MYNEWT_VAL(I2C_0) && MYNEWT_VAL(MS5837_OFB)
static struct sensor_itf i2c_0_itf_ms37 = {
    .si_type = SENSOR_ITF_I2C,
    .si_num  = 0,
    /* HW I2C address for the MS5837 */
    .si_addr = 0x76
};
#endif

#if MYNEWT_VAL(I2C_0) && MYNEWT_VAL(MS5840_OFB)
static struct sensor_itf i2c_0_itf_ms40 = {
    .si_type = SENSOR_ITF_I2C,
    .si_num  = 0,
    /* HW I2C address for the MS5840 */
    .si_addr = 0x76
};
#endif


#if MYNEWT_VAL(I2C_0) && MYNEWT_VAL(BMA253_OFB)
static struct sensor_itf i2c_0_itf_lis = {
    .si_type = SENSOR_ITF_I2C,
    .si_num  = 0,
    .si_addr = 0x18,
    .si_ints = {
        { 26, MYNEWT_VAL(BMA2XX_INT_PIN_DEVICE),
            MYNEWT_VAL(BMA2XX_INT_CFG_ACTIVE)},
        { 25, MYNEWT_VAL(BMA2XX_INT2_PIN_DEVICE),
            MYNEWT_VAL(BMA2XX_INT_CFG_ACTIVE)}
    },
};
#endif

#if MYNEWT_VAL(I2C_0) && MYNEWT_VAL(BMA2XX_OFB)
static struct sensor_itf spi2c_0_itf_bma2xx = {
    .si_type = SENSOR_ITF_I2C,
    .si_num  = 0,
    .si_addr = 0x18,
    .si_ints = {
        { 26, MYNEWT_VAL(BMA2XX_INT_PIN_DEVICE),
            MYNEWT_VAL(BMA2XX_INT_CFG_ACTIVE)},
        { 25, MYNEWT_VAL(BMA2XX_INT2_PIN_DEVICE),
            MYNEWT_VAL(BMA2XX_INT_CFG_ACTIVE)}
    },
};
#endif
#if MYNEWT_VAL(SPI_0_MASTER) && MYNEWT_VAL(BMA2XX_OFB)
//TODO:  Make INT pin nums configurable.  Leaving hardcoded
//to handle multiple bma2xx sensor interface examples
static struct sensor_itf spi2c_0_itf_bma2xx = {
    .si_type = SENSOR_ITF_SPI,
    .si_num = 0,
    .si_cs_pin = 21,
    .si_ints = {
        { 26, MYNEWT_VAL(BMA2XX_INT_PIN_DEVICE),
            MYNEWT_VAL(BMA2XX_INT_CFG_ACTIVE)},
        { 25, MYNEWT_VAL(BMA2XX_INT2_PIN_DEVICE),
            MYNEWT_VAL(BMA2XX_INT_CFG_ACTIVE)}
    },
};
#endif

#if MYNEWT_VAL(I2C_0) && MYNEWT_VAL(ADXL345_OFB)
static struct sensor_itf i2c_0_itf_adxl = {
    .si_type = SENSOR_ITF_I2C,
    .si_num  = 0,
    .si_addr = MYNEWT_VAL(ADXL345_ITF_ADDR),
    .si_ints = {
       { MYNEWT_VAL(ADXL345_INT_PIN_HOST), MYNEWT_VAL(ADXL345_INT_PIN_DEVICE),
         MYNEWT_VAL(ADXL345_INT_CFG_ACTIVE)}}
};
#endif

#if MYNEWT_VAL(I2C_0) && MYNEWT_VAL(LPS33HW_OFB)
static struct sensor_itf i2c_0_itf_lps = {
    .si_type = MYNEWT_VAL(LPS33HW_SHELL_ITF_TYPE),
    .si_num  = MYNEWT_VAL(LPS33HW_SHELL_ITF_NUM),
    .si_addr = MYNEWT_VAL(LPS33HW_SHELL_ITF_ADDR)
};
#endif

#if MYNEWT_VAL(I2C_0) && MYNEWT_VAL(LPS33THW_OFB)
static struct sensor_itf i2c_0_itf_lpst = {
    .si_type = MYNEWT_VAL(LPS33THW_SHELL_ITF_TYPE),
    .si_num  = MYNEWT_VAL(LPS33THW_SHELL_ITF_NUM),
    .si_addr = MYNEWT_VAL(LPS33THW_SHELL_ITF_ADDR)
};
#endif

#if MYNEWT_VAL(I2C_0) && MYNEWT_VAL(LIS2DW12_OFB)
static struct sensor_itf i2c_0_itf_lis2dw12 = {
    .si_type = SENSOR_ITF_I2C,
    .si_num  = 0,
    .si_addr = 0x18,
    .si_ints = {
        { MYNEWT_VAL(LIS2DW12_INT1_PIN_HOST), MYNEWT_VAL(LIS2DW12_INT1_PIN_DEVICE),
          MYNEWT_VAL(LIS2DW12_INT1_CFG_ACTIVE)}}
};
#endif

#if MYNEWT_VAL(I2C_0) && MYNEWT_VAL(LIS2DS12_OFB)
static struct sensor_itf i2c_0_itf_lis2ds12 = {
    .si_type = SENSOR_ITF_I2C,
    .si_num  = 0,
    .si_addr = 0x1D,
    .si_ints = {
        { MYNEWT_VAL(LIS2DS12_INT1_PIN_HOST), MYNEWT_VAL(LIS2DS12_INT1_PIN_DEVICE),
          MYNEWT_VAL(LIS2DS12_INT1_CFG_ACTIVE)}}
};
#endif

/**
 * MS5837 Sensor default configuration used by the creator package
 *
 * @return 0 on success, non-zero on failure
 */
#if MYNEWT_VAL(MS5837_OFB)
static int
config_ms5837_sensor(void)
{
    int rc;
    struct os_dev *dev;
    struct ms5837_cfg mscfg;

    dev = (struct os_dev *) os_dev_open("ms5837_0", OS_TIMEOUT_NEVER, NULL);
    assert(dev != NULL);

    memset(&mscfg, 0, sizeof(mscfg));


    mscfg.mc_s_temp_res_osr  = MS5837_RES_OSR_256;
    mscfg.mc_s_press_res_osr = MS5837_RES_OSR_256;
    mscfg.mc_s_mask = SENSOR_TYPE_AMBIENT_TEMPERATURE|
                      SENSOR_TYPE_PRESSURE;

    rc = ms5837_config((struct ms5837 *)dev, &mscfg);

    os_dev_close(dev);
    return rc;
}
#endif

/**
 * MS5840 Sensor default configuration used by the creator package
 *
 * @return 0 on success, non-zero on failure
 */
#if MYNEWT_VAL(MS5840_OFB)
static int
config_ms5840_sensor(void)
{
    int rc;
    struct os_dev *dev;
    struct ms5840_cfg mscfg;

    dev = (struct os_dev *) os_dev_open("ms5840_0", OS_TIMEOUT_NEVER, NULL);
    assert(dev != NULL);

    memset(&mscfg, 0, sizeof(mscfg));


    mscfg.mc_s_temp_res_osr  = MS5840_RES_OSR_256;
    mscfg.mc_s_press_res_osr = MS5840_RES_OSR_256;
    mscfg.mc_s_mask = SENSOR_TYPE_AMBIENT_TEMPERATURE|
                      SENSOR_TYPE_PRESSURE;

    rc = ms5840_config((struct ms5840 *)dev, &mscfg);

    os_dev_close(dev);
    return rc;
}
#endif


/* Sensor default configuration used by the creator package */

/**
 * BME280 Sensor default configuration used by the creator package
 *
 * @return 0 on success, non-zero on failure
 */
#if MYNEWT_VAL(BME280_OFB)
static int
config_bme280_sensor(void)
{
    int rc;
    struct os_dev *dev;
    struct bme280_cfg bmecfg;

    dev = (struct os_dev *) os_dev_open("bme280_0", OS_TIMEOUT_NEVER, NULL);
    assert(dev != NULL);

    memset(&bmecfg, 0, sizeof(bmecfg));

    bmecfg.bc_mode = BME280_MODE_NORMAL;
    bmecfg.bc_iir = BME280_FILTER_X16;
    bmecfg.bc_sby_dur = BME280_STANDBY_MS_0_5;
    bmecfg.bc_boc[0].boc_type = SENSOR_TYPE_RELATIVE_HUMIDITY;
    bmecfg.bc_boc[1].boc_type = SENSOR_TYPE_PRESSURE;
    bmecfg.bc_boc[2].boc_type = SENSOR_TYPE_AMBIENT_TEMPERATURE;
    bmecfg.bc_boc[0].boc_oversample = BME280_SAMPLING_X1;
    bmecfg.bc_boc[1].boc_oversample = BME280_SAMPLING_X16;
    bmecfg.bc_boc[2].boc_oversample = BME280_SAMPLING_X2;
    bmecfg.bc_s_mask = SENSOR_TYPE_AMBIENT_TEMPERATURE|
                       SENSOR_TYPE_PRESSURE|
                       SENSOR_TYPE_RELATIVE_HUMIDITY;

    rc = bme280_config((struct bme280 *)dev, &bmecfg);

    os_dev_close(dev);
    return rc;
}
#endif

/**
 * BMP280 Sensor default configuration used by the creator package
 *
 * @return 0 on success, non-zero on failure
 */
#if MYNEWT_VAL(BMP280_OFB)
static int
config_bmp280_sensor(void)
{
    int rc;
    struct os_dev *dev;
    struct bmp280_cfg bmpcfg;

    dev = (struct os_dev *) os_dev_open("bmp280_0", OS_TIMEOUT_NEVER, NULL);
    assert(dev != NULL);

    memset(&bmpcfg, 0, sizeof(bmpcfg));

    bmpcfg.bc_mode = BMP280_MODE_NORMAL;
    bmpcfg.bc_iir = BMP280_FILTER_X16;
    bmpcfg.bc_sby_dur = BMP280_STANDBY_MS_0_5;
    bmpcfg.bc_boc[0].boc_type = SENSOR_TYPE_AMBIENT_TEMPERATURE;
    bmpcfg.bc_boc[1].boc_type = SENSOR_TYPE_PRESSURE;
    bmpcfg.bc_boc[0].boc_oversample = BMP280_SAMPLING_X2;
    bmpcfg.bc_boc[1].boc_oversample = BMP280_SAMPLING_X16;
    bmpcfg.bc_s_mask = SENSOR_TYPE_AMBIENT_TEMPERATURE|
                       SENSOR_TYPE_PRESSURE;

    rc = bmp280_config((struct bmp280 *)dev, &bmpcfg);

    os_dev_close(dev);
    return rc;
}

#endif
/**
 * TCS34725 Sensor default configuration used by the creator package
 *
 * @return 0 on success, non-zero on failure
 */
#if MYNEWT_VAL(TCS34725_OFB)
static int
config_tcs34725_sensor(void)
{
    int rc;
    struct os_dev *dev;
    struct tcs34725_cfg tcscfg;

    dev = (struct os_dev *) os_dev_open("tcs34725_0", OS_TIMEOUT_NEVER, NULL);
    assert(dev != NULL);

    /* Gain set to 16X and Inetgration time set to 24ms */
    tcscfg.gain = TCS34725_GAIN_16X;
    tcscfg.integration_time = TCS34725_INTEGRATIONTIME_24MS;
    tcscfg.int_enable = 1;
    tcscfg.mask = SENSOR_TYPE_COLOR;

    rc = tcs34725_config((struct tcs34725 *)dev, &tcscfg);

    os_dev_close(dev);
    return rc;
}
#endif

/**
 * TSL2561 Sensor default configuration used by the creator package
 *
 * @return 0 on success, non-zero on failure
 */
#if MYNEWT_VAL(TSL2561_OFB)
static int
config_tsl2561_sensor(void)
{
    int rc;
    struct os_dev *dev;
    struct tsl2561_cfg tslcfg;

    dev = (struct os_dev *) os_dev_open("tsl2561_0", OS_TIMEOUT_NEVER, NULL);
    assert(dev != NULL);

    /* Gain set to 1X and Inetgration time set to 13ms */
    tslcfg.gain = TSL2561_LIGHT_GAIN_1X;
    tslcfg.integration_time = TSL2561_LIGHT_ITIME_13MS;
    tslcfg.mask = SENSOR_TYPE_LIGHT;

    rc = tsl2561_config((struct tsl2561 *)dev, &tslcfg);

    os_dev_close(dev);
    return rc;
}
#endif

/**
 * TSL2591 Sensor default configuration used by the creator package
 *
 * @return 0 on success, non-zero on failure
 */
#if MYNEWT_VAL(TSL2591_OFB)
static int
config_tsl2591_sensor(void)
{
    int rc;
    struct os_dev *dev;
    struct tsl2591_cfg tslcfg;

    dev = (struct os_dev *) os_dev_open("tsl2591_0", OS_TIMEOUT_NEVER, NULL);
    assert(dev != NULL);

    /* Gain set to 1X and Inetgration time set to 100ms */
    tslcfg.gain = TSL2591_LIGHT_GAIN_LOW;
    tslcfg.integration_time = TSL2591_LIGHT_ITIME_100MS;
    tslcfg.mask = SENSOR_TYPE_LIGHT;

    rc = tsl2591_config((struct tsl2591 *)dev, &tslcfg);

    os_dev_close(dev);
    return rc;
}
#endif

/**
 * DRV2605 Actuator default configuration used by the creator package
 *
 * @return 0 on success, non-zero on failure
 */
#if MYNEWT_VAL(DRV2605_OFB)
static int
config_drv2605_actuator(void)
{
    int rc;
    struct os_dev *dev;
    struct drv2605_cfg cfg = {0};

    dev = (struct os_dev *) os_dev_open("drv2605_0", OS_TIMEOUT_NEVER, NULL);
    assert(dev != NULL);

    rc = drv2605_config((struct drv2605 *) dev, &cfg);

    os_dev_close(dev);
    return rc;
}
#endif

/**
 * LSM303DLHC Sensor default configuration used by the creator package
 *
 * @return 0 on success, non-zero on failure
 */
#if MYNEWT_VAL(LSM303DLHC_OFB)
static int
config_lsm303dlhc_sensor(void)
{
    int rc;
    struct os_dev *dev;
    struct lsm303dlhc_cfg lsmcfg;

    dev = (struct os_dev *) os_dev_open("lsm303dlhc_0", OS_TIMEOUT_NEVER, NULL);
    assert(dev != NULL);

    /* read once per sec.  API should take this value in ms. */
    lsmcfg.accel_rate = LSM303DLHC_ACCEL_RATE_1;
    lsmcfg.accel_range = LSM303DLHC_ACCEL_RANGE_2;
    /* Device I2C addr for accelerometer */
    lsmcfg.acc_addr = LSM303DLHC_ADDR_ACCEL;
    /* Device I2C addr for magnetometer */
    lsmcfg.mag_addr = LSM303DLHC_ADDR_MAG;
    /* Set default mag gain to +/-1.3 gauss */
    lsmcfg.mag_gain = LSM303DLHC_MAG_GAIN_1_3;
    /* Set default mag sample rate to 15Hz */
    lsmcfg.mag_rate = LSM303DLHC_MAG_RATE_15;

    lsmcfg.mask = SENSOR_TYPE_ACCELEROMETER|
                  SENSOR_TYPE_MAGNETIC_FIELD;

    rc = lsm303dlhc_config((struct lsm303dlhc *) dev, &lsmcfg);

    os_dev_close(dev);
    return rc;
}
#endif

/**
 * MPU6050 Sensor default configuration used by the creator package
 *
 * @return 0 on success, non-zero on failure
 */
#if MYNEWT_VAL(MPU6050_OFB)
static int
config_mpu6050_sensor(void)
{
    int rc;
    struct os_dev *dev;
    struct mpu6050_cfg mpucfg;

    dev = (struct os_dev *) os_dev_open("mpu6050_0", OS_TIMEOUT_NEVER, NULL);
    assert(dev != NULL);

    mpucfg.accel_range = MPU6050_ACCEL_RANGE_4;
    mpucfg.gyro_range = MPU6050_GYRO_RANGE_500;
    mpucfg.clock_source = MPU6050_CLK_GYRO_X;
    mpucfg.sample_rate_div = 39; /* Sample Rate = Gyroscope Output Rate /
            (1 + sample_rate_div) */
    mpucfg.lpf_cfg = 3; /* See data sheet */
    mpucfg.int_enable = 0;
    mpucfg.int_cfg = MPU6050_INT_LATCH_EN | MPU6050_INT_RD_CLEAR;
    mpucfg.mask = SENSOR_TYPE_ACCELEROMETER | SENSOR_TYPE_GYROSCOPE;

    rc = mpu6050_config((struct mpu6050 *) dev, &mpucfg);

    os_dev_close(dev);
    return rc;
}
#endif

/**
 * BNO055 Sensor default configuration used by the creator package
 *
 * @return 0 on success, non-zero on failure
 */
#if MYNEWT_VAL(BNO055_OFB)
static int
config_bno055_sensor(void)
{
    int rc;
    struct os_dev *dev;
    struct bno055_cfg bcfg;

    dev = (struct os_dev *) os_dev_open("bno055_0", OS_TIMEOUT_NEVER, NULL);
    assert(dev != NULL);

    bcfg.bc_units = BNO055_ACC_UNIT_MS2   | BNO055_ANGRATE_UNIT_DPS |
                    BNO055_EULER_UNIT_DEG | BNO055_TEMP_UNIT_DEGC   |
                    BNO055_DO_FORMAT_ANDROID;

    bcfg.bc_opr_mode = BNO055_OPR_MODE_NDOF;
    bcfg.bc_pwr_mode = BNO055_PWR_MODE_NORMAL;
    bcfg.bc_acc_bw = BNO055_ACC_CFG_BW_125HZ;
    bcfg.bc_acc_range =  BNO055_ACC_CFG_RNG_16G;
    bcfg.bc_use_ext_xtal = 1;
    bcfg.bc_mask = SENSOR_TYPE_ACCELEROMETER|
                   SENSOR_TYPE_MAGNETIC_FIELD|
                   SENSOR_TYPE_GYROSCOPE|
                   SENSOR_TYPE_EULER|
                   SENSOR_TYPE_GRAVITY|
                   SENSOR_TYPE_LINEAR_ACCEL|
                   SENSOR_TYPE_ROTATION_VECTOR;

    rc = bno055_config((struct bno055 *) dev, &bcfg);

    os_dev_close(dev);
    return rc;
}
#endif

#if MYNEWT_VAL(BMA253_OFB)
/**
 * BMA253 sensor default configuration
 *
 * @return 0 on success, non-zero on failure
 */
int
config_bma253_sensor(void)
{
    struct os_dev * dev;
    struct bma253_cfg cfg = {0};
    int rc;

    dev = os_dev_open("bma253_0", OS_TIMEOUT_NEVER, NULL);
    assert(dev != NULL);

    cfg.low_g_delay_ms = BMA253_LOW_G_DELAY_MS_DEFAULT;
    cfg.high_g_delay_ms = BMA253_HIGH_G_DELAY_MS_DEFAULT;
    cfg.g_range = BMA253_G_RANGE_2;
    cfg.filter_bandwidth = BMA253_FILTER_BANDWIDTH_1000_HZ;
    cfg.use_unfiltered_data = false;
    cfg.tap_quiet = BMA253_TAP_QUIET_30_MS;
    cfg.tap_shock = BMA253_TAP_SHOCK_50_MS;
    cfg.d_tap_window = BMA253_D_TAP_WINDOW_250_MS;
    cfg.tap_wake_samples = BMA253_TAP_WAKE_SAMPLES_2;
    cfg.tap_thresh_g = 1.0;
    cfg.offset_x_g = 0.0;
    cfg.offset_y_g = 0.0;
    cfg.offset_z_g = 0.0;
    cfg.power_mode = BMA253_POWER_MODE_NORMAL;
    cfg.sleep_duration = BMA253_SLEEP_DURATION_0_5_MS;
    cfg.sensor_mask = SENSOR_TYPE_ACCELEROMETER;
    cfg.read_mode = BMA253_READ_M_POLL;

    rc = bma253_config((struct bma253 *)dev, &cfg);
    assert(rc == 0);

    os_dev_close(dev);

    return 0;
}
#endif

/**
 * ADXL345 Sensor default configuration used by the creator package
 *
 * @return 0 on success, non-zero on failure
 */
#if MYNEWT_VAL(ADXL345_OFB)
static int
config_adxl345_sensor(void)
{
    int rc;
    struct os_dev *dev;
    struct adxl345_cfg cfg;

    dev = (struct os_dev *) os_dev_open("adxl345_0", OS_TIMEOUT_NEVER, NULL);
    assert(dev != NULL);

    cfg.power_mode = ADXL345_POWER_MEASURE;
    cfg.low_power_enable = 0;
    cfg.accel_range = ADXL345_ACCEL_RANGE_4;
    cfg.sample_rate = ADXL345_RATE_12_5_HZ;

    cfg.offset_x = 0;
    cfg.offset_y = 0;
    cfg.offset_z = 0;

    cfg.tap_cfg.threshold = 0x30; /* 3g */
    cfg.tap_cfg.duration = 0x10;  /* 10 ms */
    cfg.tap_cfg.latency = 0x10;   /* 20 ms */
    cfg.tap_cfg.window = 0x80;    /* 160 ms */
    cfg.tap_cfg.x_enable = 1;
    cfg.tap_cfg.y_enable = 1;
    cfg.tap_cfg.z_enable = 1;
    cfg.tap_cfg.suppress = 0;

    cfg.freefall_threshold = 0x07; /* 440mg */
    cfg.freefall_time = 0x14; /* 100ms */

    cfg.mask = SENSOR_TYPE_ACCELEROMETER;

    rc = adxl345_config((struct adxl345 *) dev, &cfg);
    assert(rc == 0);
    return rc;
}
#endif

/*
 * LPS33HW Sensor default configuration used by the creator package
 *
 * @return 0 on success, non-zero on failure
 */
#if MYNEWT_VAL(LPS33HW_OFB)
static int
config_lps33hw_sensor(void)
{
    int rc;
    struct os_dev *dev;
    struct lps33hw_cfg cfg;

    cfg.mask = SENSOR_TYPE_PRESSURE | SENSOR_TYPE_TEMPERATURE;
    cfg.data_rate = LPS33HW_1HZ;
    cfg.lpf = LPS33HW_LPF_DISABLED;
    cfg.int_cfg.pin = 0;
    cfg.int_cfg.data_rdy = 0;
    cfg.int_cfg.pressure_low = 0;
    cfg.int_cfg.pressure_high = 0;
    cfg.int_cfg.active_low = 0;
    cfg.int_cfg.open_drain = 0;
    cfg.int_cfg.latched = 0;

    dev = (struct os_dev *) os_dev_open("lps33hw_0", OS_TIMEOUT_NEVER, NULL);
    assert(dev != NULL);

    rc = lps33hw_config((struct lps33hw *) dev, &cfg);

    os_dev_close(dev);
    return rc;
}
#endif

/*
 * LPS3T3HW Sensor default configuration used by the creator package
 *
 * @return 0 on success, non-zero on failure
 */
#if MYNEWT_VAL(LPS33THW_OFB)
static int
config_lps33thw_sensor(void)
{
    int rc;
    struct os_dev *dev;
    struct lps33thw_cfg cfg;

    cfg.mask = SENSOR_TYPE_PRESSURE | SENSOR_TYPE_TEMPERATURE;
    cfg.data_rate = LPS33THW_1HZ;
    cfg.lpf = LPS33THW_LPF_DISABLED;
    cfg.int_cfg.pin = 0;
    cfg.int_cfg.data_rdy = 0;
    cfg.int_cfg.pressure_low = 0;
    cfg.int_cfg.pressure_high = 0;
    cfg.int_cfg.active_low = 0;
    cfg.int_cfg.open_drain = 0;
    cfg.int_cfg.latched = 0;

    dev = (struct os_dev *) os_dev_open("lps33thw_0", OS_TIMEOUT_NEVER, NULL);
    assert(dev != NULL);

    rc = lps33thw_config((struct lps33thw *) dev, &cfg);

    os_dev_close(dev);
    return rc;
}
#endif

/**
 * LIS2DW12 Sensor default configuration used by the creator package
 *
 * @return 0 on success, non-zero on failure
 */
#if MYNEWT_VAL(LIS2DW12_OFB)
static int
config_lis2dw12_sensor(void)
{
    int rc;
    struct os_dev *dev;
    struct lis2dw12_cfg cfg = {0};

    dev = (struct os_dev *) os_dev_open("lis2dw12_0", OS_TIMEOUT_NEVER, NULL);
    assert(dev != NULL);

    /* Valid Tap ODRs are 400 Hz, 800 Hz and 1600 Hz  AN5038 5.6.3 */
    cfg.rate = LIS2DW12_DATA_RATE_400HZ;
    cfg.fs = LIS2DW12_FS_2G;

    cfg.offset_x = 0;
    cfg.offset_y = 0;
    cfg.offset_z = 0;
    cfg.offset_weight = 0;
    cfg.offset_en = 0;

    cfg.filter_bw = LIS2DW12_FILTER_BW_ODR_DIV_2;
    cfg.high_pass = 0;

    cfg.tap.en_x = 1;
    cfg.tap.en_y = 1;
    cfg.tap.en_z = 1;
    cfg.tap.en_4d = 0;
    cfg.tap.ths_6d = LIS2DW12_6D_THS_80_DEG;
    cfg.tap.tap_priority = LIS2DW12_TAP_PRIOR_XYZ;
    cfg.tap.tap_ths_x = 0x3; /* 1875mg = (3 * FS / 32) */
    cfg.tap.tap_ths_y = 0x3; /* 1875mg = (3 * FS / 32) */
    cfg.tap.tap_ths_z = 0x3; /* 1875mg = (3 * FS / 32) */
    cfg.tap.latency = 8; /* 640ms (= 8 * 32 / ODR) */
    cfg.tap.quiet = 0; /* 5 ms  (= 2 / ODR */
    cfg.tap.shock = 3; /* 60 ms (= 3 * 8 / ODR) */

    cfg.double_tap_event_enable = 0;

    cfg.freefall_dur = 6; /* 15ms (= 6/ODR) */
    cfg.freefall_ths = 3; /* ~312mg (= 31.25 mg * 10) */

    cfg.int1_pin_cfg = 0;
    cfg.int2_pin_cfg = 0;
    cfg.int_enable = 0;

    cfg.int_pp_od = 0;
    cfg.int_latched = 0;
    cfg.int_active_low = 0;
    cfg.slp_mode = 0;

    cfg.fifo_mode = LIS2DW12_FIFO_M_BYPASS;
    cfg.fifo_threshold = 32;

    cfg.wake_up_ths = 0; /* 0 mg (= 0 * FS / 64) */
    cfg.wake_up_dur = 0; /* 0 ms (= 0 * 1 / ODR) */
    cfg.sleep_duration = 0; /* 0 ms (= 0 * 512 / ODR) */

    cfg.stationary_detection_enable = 0;

    cfg.power_mode = LIS2DW12_PM_HIGH_PERF;
    cfg.inactivity_sleep_enable = 0;
    cfg.low_noise_enable = 1;

    cfg.read_mode.mode = LIS2DW12_READ_M_POLL;

    cfg.mask = SENSOR_TYPE_ACCELEROMETER;

    rc = lis2dw12_config((struct lis2dw12 *) dev, &cfg);
    assert(rc == 0);

    os_dev_close(dev);
    return rc;
}
#endif

/**
 * LIS2DS12 Sensor default configuration used by the creator package
 *
 * @return 0 on success, non-zero on failure
 */
#if MYNEWT_VAL(LIS2DS12_OFB)
static int
config_lis2ds12_sensor(void)
{
    int rc;
    struct os_dev *dev;
    struct lis2ds12_cfg cfg;

    dev = (struct os_dev *) os_dev_open("lis2ds12_0", OS_TIMEOUT_NEVER, NULL);
    assert(dev != NULL);

    /* single and double tap is only meaningful >= LIS2DS12_DATA_RATE_HR_14BIT_400HZ  AN4748 5.6 */
    cfg.rate = LIS2DS12_DATA_RATE_HR_14BIT_400HZ;
    cfg.fs = LIS2DS12_FS_2G;

    cfg.high_pass = 0;

    cfg.tap.en_4d = 0;
    cfg.tap.ths_6d = LIS2DS12_6D_THS_80_DEG;

    cfg.tap.en_x = 1;
    cfg.tap.en_y = 1;
    cfg.tap.en_z = 1;
    cfg.tap.tap_ths = 0xC; /* 750mg = (12 * FS / 32) */
    cfg.tap.latency = 7; /* 560ms (= 7 * 32 / ODR) */
    cfg.tap.quiet = 2; /* 20 ms (= 2 * 4 / ODR) */
    cfg.tap.shock = 2; /* 40 ms (= 2 * 8 / ODR) */

    cfg.double_tap_event_enable = 0;

    cfg.freefall_dur = 6; /* 15ms (= 6/ODR) */
    cfg.freefall_ths = 3; /* ~312mg (= 31.25 mg * 10) */

    cfg.int1_pin_cfg = 0;
    cfg.int2_pin_cfg = 0;
    cfg.map_int2_to_int1 = 0;

    cfg.int_pp_od = 0;
    cfg.int_latched = 0;
    cfg.int_active_low = 0;

    cfg.fifo_mode = LIS2DS12_FIFO_M_BYPASS;
    cfg.fifo_threshold = 32;

    cfg.wake_up_ths = 63;  /* 1.96875 mg (= 63 * FS / 64) */
    cfg.wake_up_dur = 3; /* 7.5 ms (= 3 * 1 / ODR) */
    cfg.sleep_duration = 0; /* 0 ms (= 0 * 512 / ODR) */

    cfg.inactivity_sleep_enable = 0;

    cfg.read_mode.mode = LIS2DS12_READ_M_POLL;

    cfg.mask = SENSOR_TYPE_ACCELEROMETER;

    rc = lis2ds12_config((struct lis2ds12 *) dev, &cfg);
    assert(rc == 0);

    os_dev_close(dev);
    return rc;
}
#endif

#if MYNEWT_VAL(BMA2XX_OFB)
/**
 * BMA2XX sensor default configuration
 *
 * @return 0 on success, non-zero on failure
 */
int
config_bma2xx_sensor(void)
{
    struct os_dev * dev;
    struct bma2xx_cfg cfg;
    int rc;

    dev = os_dev_open("bma2xx_0", OS_TIMEOUT_NEVER, NULL);
    assert(dev != NULL);

    cfg.model = BMA2XX_BMA280;
    cfg.low_g_delay_ms = BMA2XX_LOW_G_DELAY_MS_DEFAULT;
    cfg.high_g_delay_ms = BMA2XX_HIGH_G_DELAY_MS_DEFAULT;
    cfg.g_range = BMA2XX_G_RANGE_2;
    cfg.filter_bandwidth = BMA2XX_FILTER_BANDWIDTH_500_HZ;
    cfg.use_unfiltered_data = false;
    cfg.tap_quiet = BMA2XX_TAP_QUIET_30_MS;
    cfg.tap_shock = BMA2XX_TAP_SHOCK_50_MS;
    cfg.d_tap_window = BMA2XX_D_TAP_WINDOW_250_MS;
    cfg.tap_wake_samples = BMA2XX_TAP_WAKE_SAMPLES_16;
    cfg.tap_thresh_g = 1.0;
    cfg.offset_x_g = 0.0;
    cfg.offset_y_g = 0.0;
    cfg.offset_z_g = 0.0;
    cfg.orient_blocking = BMA2XX_ORIENT_BLOCKING_NONE;
    cfg.orient_mode = BMA2XX_ORIENT_MODE_SYMMETRICAL;
    cfg.power_mode = BMA2XX_POWER_MODE_NORMAL;
    cfg.sleep_duration = BMA2XX_SLEEP_DURATION_0_5_MS;
    cfg.sensor_mask = SENSOR_TYPE_ACCELEROMETER;

    rc = bma2xx_config((struct bma2xx *)dev, &cfg);
    assert(rc == 0);

    os_dev_close(dev);

    return 0;
}
#endif

/* Sensor device creation */
void
sensor_dev_create(void)
{
    int rc;

    (void)rc;
#if MYNEWT_VAL(DRV2605_OFB)
    rc = hal_gpio_init_out(MYNEWT_VAL(DRV2605_EN_PIN), 1);
    assert(rc == 0);

    rc = os_dev_create((struct os_dev *) &drv2605, "drv2605_0",
      OS_DEV_INIT_PRIMARY, 0, drv2605_init, (void *)&i2c_0_itf_drv);
    assert(rc == 0);

    rc = config_drv2605_actuator();
    assert(rc == 0);
#endif

#if MYNEWT_VAL(LSM303DLHC_OFB)
    /* Since this sensor has multiple I2C addreses,
     * 0x1E for accelerometer and 0x19 for magnetometer,
     * they are made part of the config. Not setting the address in the sensor
     * interface makes it take the address either from the driver or
     * from the config, however teh develeoper would like to deal with it.
     */
    rc = os_dev_create((struct os_dev *) &lsm303dlhc, "lsm303dlhc_0",
      OS_DEV_INIT_PRIMARY, 0, lsm303dlhc_init, (void *)&i2c_0_itf_lsm);
    assert(rc == 0);

    rc = config_lsm303dlhc_sensor();
    assert(rc == 0);
#endif

#if MYNEWT_VAL(MPU6050_OFB)
    rc = os_dev_create((struct os_dev *) &mpu6050, "mpu6050_0",
      OS_DEV_INIT_PRIMARY, 0, mpu6050_init, (void *)&i2c_0_itf_mpu);
    assert(rc == 0);

    rc = config_mpu6050_sensor();
    assert(rc == 0);
#endif

#if MYNEWT_VAL(BNO055_OFB)
    rc = os_dev_create((struct os_dev *) &bno055, "bno055_0",
      OS_DEV_INIT_PRIMARY, 0, bno055_init, (void *)&i2c_0_itf_bno);
    assert(rc == 0);

    rc = config_bno055_sensor();
    assert(rc == 0);
#endif

#if MYNEWT_VAL(TSL2561_OFB)
    rc = os_dev_create((struct os_dev *) &tsl2561, "tsl2561_0",
      OS_DEV_INIT_PRIMARY, 0, tsl2561_init, (void *)&i2c_0_itf_tsl);
    assert(rc == 0);

    rc = config_tsl2561_sensor();
    assert(rc == 0);
#endif

#if MYNEWT_VAL(TSL2591_OFB)
    rc = os_dev_create((struct os_dev *) &tsl2591, "tsl2591_0",
      OS_DEV_INIT_PRIMARY, 0, tsl2591_init, (void *)&i2c_0_itf_tsl);
    assert(rc == 0);

    rc = config_tsl2591_sensor();
    assert(rc == 0);
#endif

#if MYNEWT_VAL(TCS34725_OFB)
    rc = os_dev_create((struct os_dev *) &tcs34725, "tcs34725_0",
      OS_DEV_INIT_PRIMARY, 0, tcs34725_init, (void *)&i2c_0_itf_tcs);
    assert(rc == 0);

    rc = config_tcs34725_sensor();
    assert(rc == 0);
#endif

#if MYNEWT_VAL(BME280_OFB)
    rc = os_dev_create((struct os_dev *) &bme280, "bme280_0",
      OS_DEV_INIT_PRIMARY, 0, bme280_init, (void *)&spi_0_itf_bme);
    assert(rc == 0);

    rc = config_bme280_sensor();
    assert(rc == 0);
#endif

#if MYNEWT_VAL(MS5837_OFB)
    rc = os_dev_create((struct os_dev *) &ms5837, "ms5837_0",
      OS_DEV_INIT_PRIMARY, 0, ms5837_init, (void *)&i2c_0_itf_ms37);
    assert(rc == 0);

    rc = config_ms5837_sensor();
    assert(rc == 0);
#endif

#if MYNEWT_VAL(MS5840_OFB)
    rc = os_dev_create((struct os_dev *) &ms5840, "ms5840_0",
      OS_DEV_INIT_PRIMARY, 0, ms5840_init, (void *)&i2c_0_itf_ms40);
    assert(rc == 0);

    rc = config_ms5840_sensor();
    assert(rc == 0);
#endif

#if MYNEWT_VAL(BMP280_OFB)
    rc = os_dev_create((struct os_dev *) &bmp280, "bmp280_0",
      OS_DEV_INIT_PRIMARY, 0, bmp280_init, (void *)&i2c_0_itf_bmp);
    assert(rc == 0);

    rc = config_bmp280_sensor();
    assert(rc == 0);
#endif

#if MYNEWT_VAL(BMA253_OFB)
    rc = os_dev_create((struct os_dev *)&bma253, "bma253_0",
      OS_DEV_INIT_PRIMARY, 0, bma253_init, &i2c_0_itf_lis);
    assert(rc == 0);

    rc = config_bma253_sensor();
    assert(rc == 0);
#endif

#if MYNEWT_VAL(BMA2XX_OFB)
    rc = os_dev_create((struct os_dev *)&bma2xx, "bma2xx_0",
      OS_DEV_INIT_PRIMARY, 0, bma2xx_init, &spi2c_0_itf_bma2xx);
    assert(rc == 0);

    rc = config_bma2xx_sensor();
    assert(rc == 0);
#endif

#if MYNEWT_VAL(ADXL345_OFB)
    rc = os_dev_create((struct os_dev *) &adxl345, "adxl345_0",
      OS_DEV_INIT_PRIMARY, 0, adxl345_init, (void *)&i2c_0_itf_adxl);
    assert(rc == 0);

    rc = config_adxl345_sensor();
    assert(rc == 0);
#endif

#if MYNEWT_VAL(LPS33HW_OFB)
    rc = os_dev_create((struct os_dev *) &lps33hw, "lps33hw_0",
      OS_DEV_INIT_PRIMARY, 0, lps33hw_init, (void *)&i2c_0_itf_lps);
    assert(rc == 0);

    rc = config_lps33hw_sensor();
    assert(rc == 0);
#endif

#if MYNEWT_VAL(LPS33THW_OFB)
    rc = os_dev_create((struct os_dev *) &lps33thw, "lps33thw_0",
      OS_DEV_INIT_PRIMARY, 0, lps33thw_init, (void *)&i2c_0_itf_lpst);
    assert(rc == 0);

    rc = config_lps33thw_sensor();
    assert(rc == 0);
#endif

#if MYNEWT_VAL(LIS2DW12_OFB)
    rc = os_dev_create((struct os_dev *) &lis2dw12, "lis2dw12_0",
      OS_DEV_INIT_PRIMARY, 0, lis2dw12_init, (void *)&i2c_0_itf_lis2dw12);
    assert(rc == 0);

    rc = config_lis2dw12_sensor();
    assert(rc == 0);
#endif

#if MYNEWT_VAL(LIS2DS12_OFB)
    rc = os_dev_create((struct os_dev *) &lis2ds12, "lis2ds12_0",
      OS_DEV_INIT_PRIMARY, 0, lis2ds12_init, (void *)&i2c_0_itf_lis2ds12);
    assert(rc == 0);

    rc = config_lis2ds12_sensor();
    assert(rc == 0);
#endif

}
