/*
 * 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.
 */

#ifndef __BNO055_H__
#define __BNO055_H__

#include "os/mynewt.h"
#include "sensor/sensor.h"

#ifdef __cplusplus
extern "C" {
#endif

/* Power modes */
#define BNO055_PWR_MODE_NORMAL                                  0X00
#define BNO055_PWR_MODE_LOWPOWER                                0X01
#define BNO055_PWR_MODE_SUSPEND                                 0X02

/* Operation Modes */
#define BNO055_OPR_MODE_CONFIG                                  0X00
#define BNO055_OPR_MODE_ACCONLY                                 0X01
#define BNO055_OPR_MODE_MAGONLY                                 0X02
#define BNO055_OPR_MODE_GYRONLY                                 0X03
#define BNO055_OPR_MODE_ACCMAG                                  0X04
#define BNO055_OPR_MODE_ACCGYRO                                 0X05
#define BNO055_OPR_MODE_MAGGYRO                                 0X06
#define BNO055_OPR_MODE_AMG                                     0X07
#define BNO055_OPR_MODE_IMUPLUS                                 0X08
#define BNO055_OPR_MODE_COMPASS                                 0X09
#define BNO055_OPR_MODE_M4G                                     0X0A
#define BNO055_OPR_MODE_NDOF_FMC_OFF                            0X0B
#define BNO055_OPR_MODE_NDOF                                    0X0C

#define BNO055_ACC_UNIT_MS2                                      0x0
#define BNO055_ACC_UNIT_MG                                       0x1
#define BNO055_ANGRATE_UNIT_DPS                             (0 << 1)
#define BNO055_ANGRATE_UNIT_RPS                             (1 << 1)
#define BNO055_EULER_UNIT_DEG                               (0 << 2)
#define BNO055_EULER_UNIT_RAD                               (1 << 2)
#define BNO055_TEMP_UNIT_DEGC                               (0 << 4)
#define BNO055_TEMP_UNIT_DEGF                               (1 << 4)
#define BNO055_DO_FORMAT_WINDOWS                            (0 << 7)
#define BNO055_DO_FORMAT_ANDROID                            (1 << 7)

/* Accelerometer config */
#define BNO055_ACC_CFG_RNG_2G                                    0x0
#define BNO055_ACC_CFG_RNG_4G                                    0x1
#define BNO055_ACC_CFG_RNG_8G                                    0x2
#define BNO055_ACC_CFG_RNG_16G                                   0x3

#define BNO055_ACC_CFG_BW_7_81HZ                          (0x0 << 2)
#define BNO055_ACC_CFG_BW_15_63HZ                         (0x1 << 2)
#define BNO055_ACC_CFG_BW_31_25HZ                         (0x2 << 2)
#define BNO055_ACC_CFG_BW_6_25HZ                          (0x3 << 2)
#define BNO055_ACC_CFG_BW_125HZ                           (0x4 << 2)
#define BNO055_ACC_CFG_BW_250HZ                           (0x5 << 2)
#define BNO055_ACC_CFG_BW_500HZ                           (0x6 << 2)
#define BNO055_ACC_CFG_BW_1000HZ                          (0x7 << 2)

#define BNO055_ACC_CFG_OPR_MODE_NORMAL                    (0x0 << 5)
#define BNO055_ACC_CFG_OPR_MODE_SUSPEND                   (0x1 << 5)
#define BNO055_ACC_CFG_OPR_MODE_LOWPWR1                   (0x2 << 5)
#define BNO055_ACC_CFG_OPR_MODE_STD                       (0x3 << 5)
#define BNO055_ACC_CFG_OPR_MODE_LOWPWR2                   (0x4 << 5)
#define BNO055_ACC_CFG_OPR_MODE_DSUSPEND                  (0x5 << 5)

/* Gyroscope config */
#define BNO055_GYR_CFG_RNG_2000DPS                               0x0
#define BNO055_GYR_CFG_RNG_1000DPS                               0x1
#define BNO055_GYR_CFG_RNG_500DPS                                0x2
#define BNO055_GYR_CFG_RNG_250DPS                                0x3
#define BNO055_GYR_CFG_RNG_125DPS                                0x4

#define BNO055_GYR_CFG_BW_523HZ                           (0x0 << 3)
#define BNO055_GYR_CFG_BW_230HZ                           (0x1 << 3)
#define BNO055_GYR_CFG_BW_116HZ                           (0x2 << 3)
#define BNO055_GYR_CFG_BW_47HZ                            (0x3 << 3)
#define BNO055_GYR_CFG_BW_23HZ                            (0x4 << 3)
#define BNO055_GYR_CFG_BW_12HZ                            (0x5 << 3)
#define BNO055_GYR_CFG_BW_64HZ                            (0x6 << 3)
#define BNO055_GYR_CFG_BW_32HZ                            (0x7 << 3)

#define BNO055_GYR_CFG_OPR_MODE_NORMAL                    (0x0 << 5)
#define BNO055_GYR_CFG_OPR_MODE_FAST_PWR_UP               (0x1 << 5)
#define BNO055_GYR_CFG_OPR_MODE_DSUSPEND                  (0x2 << 5)
#define BNO055_GYR_CFG_OPR_MODE_SUSPEND                   (0x3 << 5)
#define BNO055_GYR_CFG_OPR_MODE_ADV_PWR_SAVE              (0x4 << 5)

/* Magnetometer config */
#define BNO055_MAG_CFG_ODR_2HZ                                   0x0
#define BNO055_MAG_CFG_ODR_6HZ                                   0x1
#define BNO055_MAG_CFG_ODR_8HZ                                   0x2
#define BNO055_MAG_CFG_ODR_10HZ                                  0x3
#define BNO055_MAG_CFG_ODR_15HZ                                  0x4
#define BNO055_MAG_CFG_ODR_20HZ                                  0x5
#define BNO055_MAG_CFG_ODR_25HZ                                  0x6
#define BNO055_MAG_CFG_ODR_30HZ                                  0x7

#define BNO055_MAG_CFG_OPR_MODE_LOWPWR                    (0x0 << 3)
#define BNO055_MAG_CFG_OPR_MODE_REG                       (0x1 << 3)
#define BNO055_MAG_CFG_OPR_MODE_EREG                      (0x2 << 3)
#define BNO055_MAG_CFG_OPR_MODE_HIGHACC                   (0x3 << 3)

#define BNO055_MAG_CFG_PWR_MODE_NORMAL                    (0x0 << 5)
#define BNO055_MAG_CFG_PWR_MODE_SLEEP                     (0x1 << 5)
#define BNO055_MAG_CFG_PWR_MODE_SUSPEND                   (0x2 << 5)
#define BNO055_MAG_CFG_PWR_MODE_FORCE_MODE                (0x3 << 5)

/*
 * Just a placeholder to specify resolution/axis x:13 bits, y:13 bits,
 * z:15 bits
 */
#define BNO055_MAG_RES_13_13_15                                 0x00

#define BNO055_AXIS_CFG_P0                                      0x00
#define BNO055_AXIS_CFG_P1                                      0x01 /* Default */
#define BNO055_AXIS_CFG_P2                                      0x02
#define BNO055_AXIS_CFG_P3                                      0x03
#define BNO055_AXIS_CFG_P4                                      0x04
#define BNO055_AXIS_CFG_P5                                      0x05
#define BNO055_AXIS_CFG_P6                                      0x06
#define BNO055_AXIS_CFG_P7                                      0x07

struct bno055_cfg {
    uint8_t bc_opr_mode;
    uint8_t bc_pwr_mode;
    uint8_t bc_units;
    uint8_t bc_placement;
    uint8_t bc_acc_range;
    uint8_t bc_acc_bw;
    uint8_t bc_acc_opr_mode;
    uint8_t bc_acc_res;
    uint8_t bc_gyro_range;
    uint8_t bc_gyro_bw;
    uint8_t bc_gyro_opr_mode;
    uint8_t bc_gyro_res;
    uint8_t bc_mag_odr;
    uint8_t bc_mag_xy_rep;
    uint8_t bc_mag_z_rep;
    uint8_t bc_mag_res;
    uint8_t bc_mag_pwr_mode;
    uint8_t bc_mag_opr_mode;
    uint8_t bc_use_ext_xtal;
    uint32_t bc_mask;
};

struct bno055 {
    struct os_dev dev;
    struct sensor sensor;
    struct bno055_cfg cfg;
    os_time_t last_read_time;
};

struct bno055_rev_info {
    uint8_t bri_accel_rev;
    uint8_t bri_mag_rev;
    uint8_t bri_gyro_rev;
    uint8_t bri_bl_rev;
    uint16_t bri_sw_rev;
};

struct bno055_calib_info {
    uint8_t bci_sys;
    uint8_t bci_gyro;
    uint8_t bci_accel;
    uint8_t bci_mag;
};

struct bno055_sensor_offsets {
    uint16_t bso_acc_off_x;
    uint16_t bso_acc_off_y;
    uint16_t bso_acc_off_z;
    uint16_t bso_gyro_off_x;
    uint16_t bso_gyro_off_y;
    uint16_t bso_gyro_off_z;
    uint16_t bso_mag_off_x;
    uint16_t bso_mag_off_y;
    uint16_t bso_mag_off_z;
    uint16_t bso_acc_radius;
    uint16_t bso_mag_radius;
};

/**
 * Initialize the bno055. This function is normally called by sysinit.
 *
 * @param dev  Pointer to the bno055_dev device descriptor
 */
int bno055_init(struct os_dev *dev, void *arg);

int bno055_config(struct bno055 *, struct bno055_cfg *);

/**
 * Get vector data from sensor
 *
 * @param The sensor ineterface
 * @param pointer to the structure to be filled up
 * @param Type of sensor
 * @return 0 on success, non-zero on error
 */
int
bno055_get_vector_data(struct sensor_itf *itf, void *datastruct, int type);

/**
 * Get quat data from sensor
 *
 * @param The sensor ineterface
 * @param sensor quat data to be filled up
 * @return 0 on success, non-zero on error
 */
int
bno055_get_quat_data(struct sensor_itf *itf, void *sqd);

/**
 * Get temperature from bno055 sensor
 *
 * @param The sensor ineterface
 * @return temperature in degree celcius
 */
int
bno055_get_temp(struct sensor_itf *itf, uint8_t *temp);

/**
 * Gets current calibration status
 *
 * @param The sensor ineterface
 * @param Calibration info structure to fill up calib state
 * @return 0 on success, non-zero on failure
 */
int
bno055_get_calib_status(struct sensor_itf *itf, struct bno055_calib_info *bci);

/**
 * Checks if bno055 is fully calibrated
 *
 * @param The sensor ineterface
 * @return 0 on success, non-zero on failure
 */
int
bno055_is_calib(struct sensor_itf *itf);

/**
 * Reads the sensor's offset registers into a byte array
 *
 * @param The sensor ineterface
 * @param byte array to return offsets into
 * @return 0 on success, non-zero on failure
 *
 */
int
bno055_get_raw_sensor_offsets(struct sensor_itf *itf, uint8_t *offsets);

/**
 *
 * Reads the sensor's offset registers into an offset struct
 *
 * @param The sensor ineterface
 * @param structure to fill up offsets data
 * @return 0 on success, non-zero on failure
 */
int
bno055_get_sensor_offsets(struct sensor_itf *itf,
                          struct bno055_sensor_offsets *offsets);

/**
 *
 * Writes calibration data to the sensor's offset registers
 *
 * @param The sensor ineterface
 * @param calibration data
 * @return 0 on success, non-zero on success
 */
int
bno055_set_sensor_raw_offsets(struct sensor_itf *itf, uint8_t* calibdata,
                              uint8_t len);

/**
 *
 * Writes to the sensor's offset registers from an offset struct
 *
 * @param The sensor ineterface
 * @param pointer to the offset structure
 * @return 0 on success, non-zero on failure
 */
int
bno055_set_sensor_offsets(struct sensor_itf *itf,
                          struct bno055_sensor_offsets  *offsets);

/**
 * Set operation mode for the bno055 sensor
 *
 * @param The sensor interface
 * @param Operation mode for the sensor
 * @return 0 on success, non-zero on failure
 */
int
bno055_set_opr_mode(struct sensor_itf *itf, uint8_t mode);

#if MYNEWT_VAL(BNO055_CLI)
int bno055_shell_init(void);
#endif

/**
 * Get Revision info for different sensors in the bno055
 *
 * @param The sensor interface
 * @param pass the pointer to the revision structure
 * @return 0 on success, non-zero on error
 */
int
bno055_get_rev_info(struct sensor_itf *itf, struct bno055_rev_info *ri);

/**
 * Set power mode for the sensor
 *
 * @param The sensor interface
 * @return mode
 */
int
bno055_set_pwr_mode(struct sensor_itf *itf, uint8_t mode);

/**
 * Setting units for the bno055 sensor
 *
 * @param The sensor interface
 * @param power mode for the sensor
 * @return 0 on success, non-zero on failure
 */
int
bno055_set_units(struct sensor_itf *itf, uint8_t val);

/**
 * Read current power mode of the sensor
 *
 * @param The sensor interface
 * @param ptr to mode variableto fill up
 * @return 0 on success, non-zero on failure
 */
int
bno055_get_pwr_mode(struct sensor_itf *itf, uint8_t *mode);

/**
 * Read current operational mode of the sensor
 *
 * @param The sensor interface
 * @param ptr to mode variable to fill up
 * @return 0 on success, non-zero on failure
 */
int
bno055_get_opr_mode(struct sensor_itf *itf, uint8_t *mode);

/**
 * Get units of the sensor
 *
 * @param The sensor interface
 * @param ptr to the units variable
 * @return 0 on success, non-zero on failure
 */
int
bno055_get_units(struct sensor_itf *itf, uint8_t *units);

/**
 * Gets system status, test results and errors if any from the sensor
 *
 * @param The sensor interface
 * @param ptr to system status
 * @param ptr to self test result
 * @param ptr to system error
 */

int
bno055_get_sys_status(struct sensor_itf *itf, uint8_t *system_status,
                      uint8_t *self_test_result, uint8_t *system_error);

/**
 * Get chip ID from the sensor
 *
 * @param The sensor interface
 * @param Pointer to the variable to fill up chip ID in
 * @return 0 on success, non-zero on failure
 */
int
bno055_get_chip_id(struct sensor_itf *itf, uint8_t *id);


#ifdef __cplusplus
}
#endif

#endif /* __BNO055_H__ */
