From 94bc8abf37946f1beca9d8bf1500cd6d5bbbd923 Mon Sep 17 00:00:00 2001 From: Maharavan Sundaram Date: Fri, 19 Apr 2024 08:39:11 +0530 Subject: [PATCH] My self made commit msg --- README.md | 4 +- bma400.c | 20 ++- bma400.h | 10 +- bma400_defs.h | 24 +++- examples/accelerometer/accelerometer.c | 66 +++++---- examples/activity_change/activity_change.c | 131 ++++++++++++------ examples/common/common.c | 46 ++++-- .../fifo_full_xyz_data/fifo_full_xyz_data.c | 72 ++++------ .../fifo_full_xyz_data_sensortime.c | 78 +++++------ .../fifo_watermark_xyz_data.c | 82 +++++------ .../fifo_watermark_xyz_data_sensortime.c | 97 ++++++------- examples/orientation/orientation.c | 59 +++++--- examples/selftest/selftest.c | 7 - examples/step_counter/step_counter.c | 14 +- examples/tap_detection/tap_detection.c | 18 +-- 15 files changed, 385 insertions(+), 343 deletions(-) diff --git a/README.md b/README.md index c73b656..6fcd06f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# BMA400 Sensor API +# BMA400 SensorAPI -> Bosch Sensortec's BMA400 accelerometer sensor API +> Bosch Sensortec's BMA400 accelerometer SensorAPI ## Sensor Overview The BMA400 is the first real ultra-low power acceleration sensor that minimizes power consumption without compromising on performance. Featuring 12-bit digital resolution, continuous measurement and a defined selectable bandwidth combined with ultra-low power the BMA400 allows low-noise measurement of accelerations in three perpendicular axes. The BMA400 thus senses tilt, orientation, tab/double tab, and enables plug 'n' play step counting with activity recognition especially suited for wearable devices which need a long-lasting battery lifetime. diff --git a/bma400.c b/bma400.c index d6460f4..212d553 100644 --- a/bma400.c +++ b/bma400.c @@ -31,8 +31,8 @@ * POSSIBILITY OF SUCH DAMAGE. * * @file bma400.c -* @date 2020-06-05 -* @version v1.5.8 +* @date 2021-02-22 +* @version v1.5.9 * */ @@ -510,7 +510,7 @@ static int8_t read_fifo(struct bma400_fifo_data *fifo, struct bma400_dev *dev); * @return Nothing */ static void unpack_accel_frame(struct bma400_fifo_data *fifo, - struct bma400_sensor_data *accel_data, + struct bma400_fifo_sensor_data *accel_data, uint16_t *frame_count, const struct bma400_dev *dev); @@ -544,7 +544,7 @@ static void check_frame_available(const struct bma400_fifo_data *fifo, * @return Nothing */ static void unpack_accel(const struct bma400_fifo_data *fifo, - struct bma400_sensor_data *accel_data, + struct bma400_fifo_sensor_data *accel_data, uint16_t *data_index, uint8_t accel_width, uint8_t frame_header); @@ -728,6 +728,7 @@ int8_t bma400_get_regs(uint8_t reg_addr, uint8_t *reg_data, uint32_t len, struct { int8_t rslt; uint16_t index; + uint8_t temp_buff[BMA400_MAX_LEN]; /* Check for null pointer in the device structure */ rslt = null_ptr_check(dev); @@ -735,9 +736,6 @@ int8_t bma400_get_regs(uint8_t reg_addr, uint8_t *reg_data, uint32_t len, struct /* Proceed if null check is fine */ if ((rslt == BMA400_OK) && (reg_data != NULL)) { - uint32_t temp_len = len + dev->dummy_byte; - uint8_t temp_buff[temp_len]; - if (dev->intf != BMA400_I2C_INTF) { /* If interface selected is SPI */ @@ -745,7 +743,7 @@ int8_t bma400_get_regs(uint8_t reg_addr, uint8_t *reg_data, uint32_t len, struct } /* Read the data from the reg_addr */ - dev->intf_rslt = dev->read(reg_addr, temp_buff, temp_len, dev->intf_ptr); + dev->intf_rslt = dev->read(reg_addr, temp_buff, (len + dev->dummy_byte), dev->intf_ptr); if (dev->intf_rslt == BMA400_INTF_RET_SUCCESS) { for (index = 0; index < len; index++) @@ -1394,7 +1392,7 @@ int8_t bma400_get_fifo_data(struct bma400_fifo_data *fifo, struct bma400_dev *de } int8_t bma400_extract_accel(struct bma400_fifo_data *fifo, - struct bma400_sensor_data *accel_data, + struct bma400_fifo_sensor_data *accel_data, uint16_t *frame_count, const struct bma400_dev *dev) { @@ -3050,7 +3048,7 @@ static int8_t read_fifo(struct bma400_fifo_data *fifo, struct bma400_dev *dev) } static void unpack_accel_frame(struct bma400_fifo_data *fifo, - struct bma400_sensor_data *accel_data, + struct bma400_fifo_sensor_data *accel_data, uint16_t *frame_count, const struct bma400_dev *dev) { @@ -3302,7 +3300,7 @@ static void check_frame_available(const struct bma400_fifo_data *fifo, } static void unpack_accel(const struct bma400_fifo_data *fifo, - struct bma400_sensor_data *accel_data, + struct bma400_fifo_sensor_data *accel_data, uint16_t *data_index, uint8_t accel_width, uint8_t frame_header) diff --git a/bma400.h b/bma400.h index d602dcc..b7bb9bb 100644 --- a/bma400.h +++ b/bma400.h @@ -31,8 +31,8 @@ * POSSIBILITY OF SUCH DAMAGE. * * @file bma400.h -* @date 2020-06-05 -* @version v1.5.8 +* @date 2021-02-22 +* @version v1.5.9 * */ @@ -326,7 +326,7 @@ int8_t bma400_get_fifo_data(struct bma400_fifo_data *fifo, struct bma400_dev *de * \ingroup bma400ApiFifo * \page bma400_api_bma400_extract_accel bma400_extract_accel * \code - * int8_t bma400_extract_accel(struct bma400_fifo_data *fifo, struct bma400_sensor_data *accel_data, + * int8_t bma400_extract_accel(struct bma400_fifo_data *fifo, struct bma400_fifo_sensor_data *accel_data, * uint16_t *frame_count, const struct bma400_dev *dev); * \endcode * @details This API parses and extracts the accelerometer frames, FIFO time @@ -339,7 +339,7 @@ int8_t bma400_get_fifo_data(struct bma400_fifo_data *fifo, struct bma400_dev *de * * @param[in,out] fifo : Pointer to the FIFO structure. * - * @param[out] accel_data : Structure instance of bma400_sensor_data where + * @param[out] accel_data : Structure instance of bma400_fifo_sensor_data where * the accelerometer data from FIFO is extracted * and stored after calling this API * @@ -355,7 +355,7 @@ int8_t bma400_get_fifo_data(struct bma400_fifo_data *fifo, struct bma400_dev *de * @retval -ve value -> Error */ int8_t bma400_extract_accel(struct bma400_fifo_data *fifo, - struct bma400_sensor_data *accel_data, + struct bma400_fifo_sensor_data *accel_data, uint16_t *frame_count, const struct bma400_dev *dev); diff --git a/bma400_defs.h b/bma400_defs.h index 94caa69..5a3825b 100644 --- a/bma400_defs.h +++ b/bma400_defs.h @@ -31,8 +31,8 @@ * POSSIBILITY OF SUCH DAMAGE. * * @file bma400_defs.h -* @date 2020-06-05 -* @version v1.5.8 +* @date 2021-02-22 +* @version v1.5.9 * */ @@ -121,6 +121,9 @@ #define BMA400_I2C_ADDRESS_SDO_LOW UINT8_C(0x14) #define BMA400_I2C_ADDRESS_SDO_HIGH UINT8_C(0x15) +/* Maximum read length */ +#define BMA400_MAX_LEN UINT8_C(128) + /* Power mode configurations */ #define BMA400_MODE_NORMAL UINT8_C(0x02) #define BMA400_MODE_SLEEP UINT8_C(0x00) @@ -430,7 +433,7 @@ /* BMA400 FIFO data masks */ #define BMA400_FIFO_HEADER_MASK UINT8_C(0x3E) -#define BMA400_FIFO_BYTES_OVERREAD UINT8_C(25) +#define BMA400_FIFO_BYTES_OVERREAD UINT8_C(100) #define BMA400_AWIDTH_MASK UINT8_C(0xEF) #define BMA400_FIFO_DATA_EN_MASK UINT8_C(0x0E) @@ -1296,6 +1299,21 @@ struct bma400_sensor_data uint32_t sensortime; }; +/* + * BMA400 sensor data for FIFO + */ +struct bma400_fifo_sensor_data +{ + /* X-axis sensor data */ + int16_t x; + + /* Y-axis sensor data */ + int16_t y; + + /* Z-axis sensor data */ + int16_t z; +}; + /* * BMA400 interrupt selection */ diff --git a/examples/accelerometer/accelerometer.c b/examples/accelerometer/accelerometer.c index b77a20d..2a8275f 100644 --- a/examples/accelerometer/accelerometer.c +++ b/examples/accelerometer/accelerometer.c @@ -5,24 +5,48 @@ * */ -/*! - * @ingroup bma400Examples - * @defgroup bma400ExamplesAccelerometer Accelerometer read - * @brief To read accelerometer xyz data for defined range and ODR - * \include accelerometer.c - */ - #include #include "bma400.h" #include "common.h" +/************************************************************************/ +/********* Macros *************/ +/************************************************************************/ + /* Earth's gravity in m/s^2 */ #define GRAVITY_EARTH (9.80665f) /* 39.0625us per tick */ #define SENSOR_TICK_TO_S (0.0000390625f) -static float lsb_to_ms2(int16_t accel_data, uint8_t g_range, uint8_t bit_width); +/************************************************************************/ +/********* Static APIs *************/ +/************************************************************************/ + +/*! + * @brief This internal API converts raw sensor values(LSB) to meters per seconds square. + * + * @param[in] accel_data : Raw sensor value. + * @param[in] g_range : Accel Range selected (2G, 4G, 8G, 16G). + * @param[in] bit_width : Resolution of the sensor. + * + * @return Accel values in meters per second square. + * + */ +static float lsb_to_ms2(int16_t accel_data, uint8_t g_range, uint8_t bit_width) +{ + float accel_ms2; + int16_t half_scale; + + half_scale = 1 << (bit_width - 1); + accel_ms2 = (GRAVITY_EARTH * accel_data * g_range) / half_scale; + + return accel_ms2; +} + +/************************************************************************/ +/********* Main Function *************/ +/************************************************************************/ int main(int argc, char const *argv[]) { @@ -39,15 +63,15 @@ int main(int argc, char const *argv[]) * For I2C : BMA400_I2C_INTF * For SPI : BMA400_SPI_INTF */ - rslt = bma400_interface_init(&bma, BMA400_SPI_INTF); + rslt = bma400_interface_init(&bma, BMA400_I2C_INTF); bma400_check_rslt("bma400_interface_init", rslt); - rslt = bma400_soft_reset(&bma); - bma400_check_rslt("bma400_soft_reset", rslt); - rslt = bma400_init(&bma); bma400_check_rslt("bma400_init", rslt); + rslt = bma400_soft_reset(&bma); + bma400_check_rslt("bma400_soft_reset", rslt); + /* Select the type of configuration to be modified */ conf.type = BMA400_ACCEL; @@ -94,7 +118,8 @@ int main(int argc, char const *argv[]) z = lsb_to_ms2(data.z, 2, 12); t = (float)data.sensortime * SENSOR_TICK_TO_S; - printf("Gravity-x : %.2f, Gravity-y : %.2f, Gravity-z : %.2f, t(s) : %.4f\r\n", x, y, z, t); + printf("Acc_Raw_X : %d Acc_Raw_Y : %d Acc_Raw_Z : %d", data.x, data.y, data.z); + printf("\tAcc_ms2_X : %.2f, Acc_ms2_Y : %.2f, Acc_ms2_Z : %.2f, t(s) : %.4f\n", x, y, z, t); n_samples--; } } @@ -120,7 +145,8 @@ int main(int argc, char const *argv[]) y = lsb_to_ms2(data.y, 2, 12); z = lsb_to_ms2(data.z, 2, 12); - printf("Gravity-x : %.2f, Gravity-y : %.2f, Gravity-z : %.2f\r\n", x, y, z); + printf("Acc_Raw_X : %d Acc_Raw_Y : %d Acc_Raw_Z : %d", data.x, data.y, data.z); + printf("\tAcc_ms2_X : %.2f, Acc_ms2_Y : %.2f, Acc_ms2_Z : %.2f\n", x, y, z); n_samples--; } } @@ -129,15 +155,3 @@ int main(int argc, char const *argv[]) return rslt; } - -static float lsb_to_ms2(int16_t accel_data, uint8_t g_range, uint8_t bit_width) -{ - float accel_ms2; - int16_t half_scale; - - half_scale = 1 << (bit_width - 1); - accel_ms2 = (GRAVITY_EARTH * accel_data * g_range) / half_scale; - - return accel_ms2; - -} diff --git a/examples/activity_change/activity_change.c b/examples/activity_change/activity_change.c index b9d2651..2c1abe0 100644 --- a/examples/activity_change/activity_change.c +++ b/examples/activity_change/activity_change.c @@ -5,20 +5,24 @@ * */ -/*! - * @ingroup bma400Examples - * @defgroup bma400ExamplesActChange Activity change - * @brief To showcase activity change feature - * \include activity_change.c - */ - #include #include "bma400.h" #include "common.h" +/************************************************************************/ +/********* Macros *************/ +/************************************************************************/ + /* Macro to determine count of activity change for each axis */ #define BMA400_INT_COUNTER UINT8_C(5) +/* 39.0625us per tick */ +#define SENSOR_TICK_TO_S (0.0000390625f) + +/************************************************************************/ +/********* Global Variables *************/ +/************************************************************************/ + /* struct to act as counter to test activity change interrupt - axis wise */ struct test_axes_wise_counter { @@ -27,6 +31,10 @@ struct test_axes_wise_counter uint8_t z_counter; }; +/************************************************************************/ +/********* Main Function *************/ +/************************************************************************/ + int main(int argc, char const *argv[]) { struct bma400_dev bma; @@ -37,22 +45,22 @@ int main(int argc, char const *argv[]) struct test_axes_wise_counter act_ch_cnt = { 0 }; struct bma400_sensor_data accel; struct bma400_sensor_conf accel_settin[2] = { { 0 } }; - struct bma400_int_enable int_en; - - printf("Functionality test for Activity change interrupt\n"); + struct bma400_int_enable int_en[2]; /* Interface reference is given as a parameter * For I2C : BMA400_I2C_INTF * For SPI : BMA400_SPI_INTF */ - rslt = bma400_interface_init(&bma, BMA400_SPI_INTF); + rslt = bma400_interface_init(&bma, BMA400_I2C_INTF); bma400_check_rslt("bma400_interface_init", rslt); + rslt = bma400_init(&bma); + bma400_check_rslt("bma400_init", rslt); + rslt = bma400_soft_reset(&bma); bma400_check_rslt("bma400_soft_reset", rslt); - rslt = bma400_init(&bma); - bma400_check_rslt("bma400_init", rslt); + printf("Functionality test for Activity change interrupt\n"); accel_settin[0].type = BMA400_ACTIVITY_CHANGE_INT; accel_settin[1].type = BMA400_ACCEL; @@ -77,10 +85,14 @@ int main(int argc, char const *argv[]) rslt = bma400_set_power_mode(BMA400_MODE_NORMAL, &bma); bma400_check_rslt("bma400_set_power_mode", rslt); - int_en.type = BMA400_ACTIVITY_CHANGE_INT_EN; - int_en.conf = BMA400_ENABLE; + int_en[0].type = BMA400_ACTIVITY_CHANGE_INT_EN; + int_en[0].conf = BMA400_ENABLE; - rslt = bma400_enable_interrupt(&int_en, 1, &bma); + int_en[1].type = BMA400_DRDY_INT_EN; + int_en[1].conf = BMA400_ENABLE; + + /* Enable activity interrupt and data ready interrupt */ + rslt = bma400_enable_interrupt(int_en, 2, &bma); bma400_check_rslt("bma400_enable_interrupt", rslt); printf("Show activity on x y z axes of the board\n"); @@ -98,16 +110,27 @@ int main(int argc, char const *argv[]) printf("Activity change interrupt asserted on X axis\n"); act_ch_cnt.x_counter++; - rslt = bma400_get_accel_data(BMA400_DATA_SENSOR_TIME, &accel, &bma); - bma400_check_rslt("bma400_get_accel_data_X", rslt); - - if (rslt == BMA400_OK) + while (1) { - printf("Accel Data : X : %d Y : %d Z : %d SENSOR_TIME : %d\n", - accel.x, - accel.y, - accel.z, - accel.sensortime); + rslt = bma400_get_interrupt_status(&int_status, &bma); + bma400_check_rslt("bma400_get_interrupt_status", rslt); + + if (int_status & BMA400_ASSERTED_DRDY_INT) + { + rslt = bma400_get_accel_data(BMA400_DATA_SENSOR_TIME, &accel, &bma); + bma400_check_rslt("bma400_get_accel_data", rslt); + + if (rslt == BMA400_OK) + { + printf("Accel Data : Raw_X : %d Raw_Y : %d Raw_Z : %d SENSOR_TIME(s) : %.4f\n", + accel.x, + accel.y, + accel.z, + (float)(accel.sensortime * SENSOR_TICK_TO_S)); + } + + break; + } } } @@ -116,16 +139,27 @@ int main(int argc, char const *argv[]) printf("Activity change interrupt asserted on Y axis\n"); act_ch_cnt.y_counter++; - rslt = bma400_get_accel_data(BMA400_DATA_SENSOR_TIME, &accel, &bma); - bma400_check_rslt("bma400_get_accel_data_Y", rslt); - - if (rslt == BMA400_OK) + while (1) { - printf("Accel Data : X : %d Y : %d Z : %d SENSOR_TIME : %d\n", - accel.x, - accel.y, - accel.z, - accel.sensortime); + rslt = bma400_get_interrupt_status(&int_status, &bma); + bma400_check_rslt("bma400_get_interrupt_status", rslt); + + if (int_status & BMA400_ASSERTED_DRDY_INT) + { + rslt = bma400_get_accel_data(BMA400_DATA_SENSOR_TIME, &accel, &bma); + bma400_check_rslt("bma400_get_accel_data", rslt); + + if (rslt == BMA400_OK) + { + printf("Accel Data : Raw_X : %d Raw_Y : %d Raw_Z : %d SENSOR_TIME(s) : %.4f\n", + accel.x, + accel.y, + accel.z, + (float)(accel.sensortime * SENSOR_TICK_TO_S)); + } + + break; + } } } @@ -134,16 +168,27 @@ int main(int argc, char const *argv[]) printf("Activity change interrupt asserted on Z axis\n"); act_ch_cnt.z_counter++; - rslt = bma400_get_accel_data(BMA400_DATA_SENSOR_TIME, &accel, &bma); - bma400_check_rslt("bma400_get_accel_data_Z", rslt); - - if (rslt == BMA400_OK) + while (1) { - printf("Accel Data : X : %d Y : %d Z : %d SENSOR_TIME : %d\n", - accel.x, - accel.y, - accel.z, - accel.sensortime); + rslt = bma400_get_interrupt_status(&int_status, &bma); + bma400_check_rslt("bma400_get_interrupt_status", rslt); + + if (int_status & BMA400_ASSERTED_DRDY_INT) + { + rslt = bma400_get_accel_data(BMA400_DATA_SENSOR_TIME, &accel, &bma); + bma400_check_rslt("bma400_get_accel_data", rslt); + + if (rslt == BMA400_OK) + { + printf("Accel Data : Raw_X : %d Raw_Y : %d Raw_Z : %d SENSOR_TIME(s) : %.4f\n", + accel.x, + accel.y, + accel.z, + (float)(accel.sensortime * SENSOR_TICK_TO_S)); + } + + break; + } } } diff --git a/examples/common/common.c b/examples/common/common.c index 7a5ea81..c03d130 100644 --- a/examples/common/common.c +++ b/examples/common/common.c @@ -14,6 +14,9 @@ /*! Read write length varies based on user requirement */ #define READ_WRITE_LENGTH UINT8_C(46) +/*! BMA400 shuttle board ID */ +#define BMA400_SHUTTLE_ID UINT16_C(0x1A1) + /* Variable to store the device address */ static uint8_t dev_addr; @@ -74,19 +77,19 @@ void bma400_check_rslt(const char api_name[], int8_t rslt) /* Do nothing */ break; case BMA400_E_NULL_PTR: - printf("Error [%d] : Null pointer\r\n", rslt); + printf("API : %s Error [%d] : Null pointer\r\n", api_name, rslt); break; case BMA400_E_COM_FAIL: - printf("Error [%d] : Communication failure\r\n", rslt); + printf("API : %s Error [%d] : Communication failure\r\n", api_name, rslt); break; case BMA400_E_INVALID_CONFIG: - printf("Error [%d] : Invalid configuration\r\n", rslt); + printf("API : %s Error [%d] : Invalid configuration\r\n", api_name, rslt); break; case BMA400_E_DEV_NOT_FOUND: - printf("Error [%d] : Device not found\r\n", rslt); + printf("API : %s Error [%d] : Device not found\r\n", api_name, rslt); break; default: - printf("Error [%d] : Unknown error code\r\n", rslt); + printf("API : %s Error [%d] : Unknown error code\r\n", api_name, rslt); break; } } @@ -94,17 +97,12 @@ void bma400_check_rslt(const char api_name[], int8_t rslt) int8_t bma400_interface_init(struct bma400_dev *bma400, uint8_t intf) { int8_t rslt = BMA400_OK; - - /* Switch VDD for sensor off */ - coines_set_shuttleboard_vdd_vddio_config(0, 0); - coines_config_i2c_bus(COINES_I2C_BUS_0, COINES_I2C_FAST_MODE); - - /* Switch VDD for sensor on */ - coines_set_shuttleboard_vdd_vddio_config(3300, 3300); + struct coines_board_info board_info; if (bma400 != NULL) { int16_t result = coines_open_comm_intf(COINES_COMM_INTF_USB); + if (result < COINES_SUCCESS) { printf( @@ -113,6 +111,21 @@ int8_t bma400_interface_init(struct bma400_dev *bma400, uint8_t intf) exit(result); } + rslt = coines_get_board_info(&board_info); + +#if defined(PC) + setbuf(stdout, NULL); +#endif + + if (rslt == COINES_SUCCESS) + { + if ((board_info.shuttle_id != BMA400_SHUTTLE_ID)) + { + printf("! Warning invalid sensor shuttle \n ," "This application will not support this sensor \n"); + exit(COINES_E_FAILURE); + } + } + coines_set_shuttleboard_vdd_vddio_config(0, 0); coines_delay_msec(100); @@ -159,5 +172,14 @@ int8_t bma400_interface_init(struct bma400_dev *bma400, uint8_t intf) void bma400_coines_deinit(void) { + fflush(stdout); + + coines_set_shuttleboard_vdd_vddio_config(0, 0); + coines_delay_msec(100); + + /* Coines interface reset */ + coines_soft_reset(); + coines_delay_msec(100); + coines_close_comm_intf(COINES_COMM_INTF_USB); } diff --git a/examples/fifo_full_xyz_data/fifo_full_xyz_data.c b/examples/fifo_full_xyz_data/fifo_full_xyz_data.c index 0eea766..036a3d3 100644 --- a/examples/fifo_full_xyz_data/fifo_full_xyz_data.c +++ b/examples/fifo_full_xyz_data/fifo_full_xyz_data.c @@ -5,27 +5,30 @@ * */ -/*! - * @ingroup bma400Examples - * @defgroup bma400ExamplesFifo FIFO read - * @brief Read and extract FIFO data - * \include fifo_full_xyz_data.c - */ - #include #include "bma400.h" #include "common.h" -/* Earth's gravity in m/s^2 */ -#define GRAVITY_EARTH (9.80665f) +/************************************************************************/ +/********* Macros *************/ +/************************************************************************/ -/* Total number of frames */ -#define N_FRAMES_FULL 1024 +/* Total FIFO size */ +#define FIFO_SIZE UINT16_C(1024) /* Add extra bytes to get complete fifo data */ -#define FIFO_SIZE_FULL (N_FRAMES_FULL + BMA400_FIFO_BYTES_OVERREAD) +#define FIFO_SIZE_FULL (FIFO_SIZE + BMA400_FIFO_BYTES_OVERREAD) + +/*! Number of accel frames to be extracted from FIFO + * Calculation: + * fifo_buffer = 1024, accel_frame_len = 6, header_byte = 1. + * fifo_accel_frame_count = (1024 / (6 + 1)) = 146 frames + */ +#define FIFO_ACCEL_FRAME_COUNT UINT8_C(146) -static float lsb_to_ms2(int16_t accel_data, uint8_t g_range, uint8_t bit_width); +/************************************************************************/ +/********* Main Function *************/ +/************************************************************************/ int main(int argc, char const *argv[]) { @@ -33,15 +36,14 @@ int main(int argc, char const *argv[]) uint16_t index; - struct bma400_sensor_data accel_data[N_FRAMES_FULL] = { { 0 } }; + struct bma400_fifo_sensor_data accel_data[FIFO_ACCEL_FRAME_COUNT] = { { 0 } }; struct bma400_int_enable int_en; struct bma400_fifo_data fifo_frame; struct bma400_device_conf fifo_conf; struct bma400_sensor_conf conf; uint16_t int_status = 0; uint8_t fifo_buff[FIFO_SIZE_FULL] = { 0 }; - uint16_t accel_frames_req = N_FRAMES_FULL; - float x, y, z; + uint16_t accel_frames_req = FIFO_ACCEL_FRAME_COUNT; uint8_t try = 1; struct bma400_dev bma; @@ -53,14 +55,12 @@ int main(int argc, char const *argv[]) rslt = bma400_interface_init(&bma, BMA400_I2C_INTF); bma400_check_rslt("bma400_interface_init", rslt); - printf("Read FIFO Full interrupt XYZ data\n"); + rslt = bma400_init(&bma); + bma400_check_rslt("bma400_init", rslt); rslt = bma400_soft_reset(&bma); bma400_check_rslt("bma400_soft_reset", rslt); - rslt = bma400_init(&bma); - bma400_check_rslt("bma400_init", rslt); - /* Select the type of configuration to be modified */ conf.type = BMA400_ACCEL; @@ -102,7 +102,9 @@ int main(int argc, char const *argv[]) rslt = bma400_enable_interrupt(&int_en, 1, &bma); bma400_check_rslt("bma400_enable_interrupt", rslt); - while (try <= 25) + printf("Read FIFO Full interrupt XYZ data\n"); + + while (try <= 10) { rslt = bma400_get_interrupt_status(&int_status, &bma); bma400_check_rslt("bma400_get_interrupt_status", rslt); @@ -111,6 +113,8 @@ int main(int argc, char const *argv[]) { printf("\n\nIteration : %d\n\n", try); + fifo_frame.length = FIFO_SIZE_FULL; + printf("Requested FIFO length : %d\n", fifo_frame.length); rslt = bma400_get_fifo_data(&fifo_frame, &bma); @@ -118,7 +122,7 @@ int main(int argc, char const *argv[]) printf("Available FIFO length : %d\n", fifo_frame.length); - accel_frames_req = N_FRAMES_FULL; + accel_frames_req = FIFO_ACCEL_FRAME_COUNT; rslt = bma400_extract_accel(&fifo_frame, accel_data, &accel_frames_req, &bma); bma400_check_rslt("bma400_extract_accel", rslt); @@ -126,24 +130,14 @@ int main(int argc, char const *argv[]) { printf("Extracted FIFO frames : %d\n", accel_frames_req); - printf("Accel data in LSB units and Gravity data in m/s^2\n"); - for (index = 0; index < accel_frames_req; index++) { /* 12-bit accelerometer at range 2G */ - printf("Accel[%d] X : %d raw LSB Y : %d raw LSB Z : %d raw LSB\n", + printf("Accel[%d] Raw_X : %d Raw_Y : %d Raw_Z : %d \n", index, accel_data[index].x, accel_data[index].y, accel_data[index].z); - - /* 12-bit accelerometer at range 2G */ - x = lsb_to_ms2(accel_data[index].x, 2, 12); - y = lsb_to_ms2(accel_data[index].y, 2, 12); - z = lsb_to_ms2(accel_data[index].z, 2, 12); - - /* Print the data in m/s2. */ - printf("\t Gravity-x = %4.2f, Gravity-y = %4.2f, Gravity-z = %4.2f\n", x, y, z); } } @@ -175,15 +169,3 @@ int main(int argc, char const *argv[]) return rslt; } - -static float lsb_to_ms2(int16_t accel_data, uint8_t g_range, uint8_t bit_width) -{ - float accel_ms2; - int16_t half_scale; - - half_scale = 1 << (bit_width - 1); - accel_ms2 = (GRAVITY_EARTH * accel_data * g_range) / half_scale; - - return accel_ms2; - -} diff --git a/examples/fifo_full_xyz_data_sensortime/fifo_full_xyz_data_sensortime.c b/examples/fifo_full_xyz_data_sensortime/fifo_full_xyz_data_sensortime.c index cb83940..dd7f6e6 100644 --- a/examples/fifo_full_xyz_data_sensortime/fifo_full_xyz_data_sensortime.c +++ b/examples/fifo_full_xyz_data_sensortime/fifo_full_xyz_data_sensortime.c @@ -5,30 +5,35 @@ * */ -/*! - * @ingroup bma400Examples - * @defgroup bma400ExamplesFifoST FIFO read with sensortime - * @brief Read and extract FIFO data with sensortime - * \include fifo_full_xyz_data_sensortime.c - */ - #include #include "bma400.h" #include "common.h" -/* Earth's gravity in m/s^2 */ -#define GRAVITY_EARTH (9.80665f) +/************************************************************************/ +/********* Macros *************/ +/************************************************************************/ /* 39.0625us per tick */ -#define SENSOR_TICK_TO_S (0.0000390625f) +#define SENSOR_TICK_TO_S (0.0000390625f) -/* Total number of frames */ -#define N_FRAMES_FULL 1024 +/* Total FIFO size */ +#define FIFO_SIZE UINT16_C(1024) /* Add extra bytes to get complete fifo data */ -#define FIFO_SIZE_FULL (N_FRAMES_FULL + BMA400_FIFO_BYTES_OVERREAD) +#define FIFO_SIZE_FULL (FIFO_SIZE + BMA400_FIFO_BYTES_OVERREAD) -static float lsb_to_ms2(int16_t accel_data, uint8_t g_range, uint8_t bit_width); +/*! Number of accel frames to be extracted from FIFO + * Calculation: + * fifo_buffer = 1024, accel_frame_len = 6, header_byte = 1. + * fifo_accel_frame_count = (1024 / (6 + 1)) = 146 frames + * + * Added extra frames to extract sensortime frame + */ +#define FIFO_ACCEL_FRAME_COUNT UINT8_C(200) + +/************************************************************************/ +/********* Main Function *************/ +/************************************************************************/ int main(int argc, char const *argv[]) { @@ -36,15 +41,14 @@ int main(int argc, char const *argv[]) uint16_t index; - struct bma400_sensor_data accel_data[N_FRAMES_FULL] = { { 0 } }; + struct bma400_fifo_sensor_data accel_data[FIFO_ACCEL_FRAME_COUNT] = { { 0 } }; struct bma400_int_enable int_en; struct bma400_fifo_data fifo_frame; struct bma400_device_conf fifo_conf; struct bma400_sensor_conf conf; uint16_t int_status = 0; uint8_t fifo_buff[FIFO_SIZE_FULL] = { 0 }; - uint16_t accel_frames_req = N_FRAMES_FULL; - float x, y, z; + uint16_t accel_frames_req = FIFO_ACCEL_FRAME_COUNT; uint8_t try = 1; struct bma400_dev bma; @@ -56,14 +60,12 @@ int main(int argc, char const *argv[]) rslt = bma400_interface_init(&bma, BMA400_I2C_INTF); bma400_check_rslt("bma400_interface_init", rslt); - printf("Read FIFO Full interrupt XYZ data with sensortime\n"); + rslt = bma400_init(&bma); + bma400_check_rslt("bma400_init", rslt); rslt = bma400_soft_reset(&bma); bma400_check_rslt("bma400_soft_reset", rslt); - rslt = bma400_init(&bma); - bma400_check_rslt("bma400_init", rslt); - /* Select the type of configuration to be modified */ conf.type = BMA400_ACCEL; @@ -105,7 +107,9 @@ int main(int argc, char const *argv[]) rslt = bma400_enable_interrupt(&int_en, 1, &bma); bma400_check_rslt("bma400_enable_interrupt", rslt); - while (try <= 25) + printf("Read FIFO Full interrupt XYZ data with sensortime\n"); + + while (try <= 10) { rslt = bma400_get_interrupt_status(&int_status, &bma); bma400_check_rslt("bma400_get_interrupt_status", rslt); @@ -116,12 +120,16 @@ int main(int argc, char const *argv[]) printf("Requested FIFO length : %d\n", fifo_frame.length); + fifo_frame.length = FIFO_SIZE_FULL; + rslt = bma400_get_fifo_data(&fifo_frame, &bma); bma400_check_rslt("bma400_get_fifo_data", rslt); printf("Available FIFO length : %d\n", fifo_frame.length); - accel_frames_req = N_FRAMES_FULL; + accel_frames_req = FIFO_ACCEL_FRAME_COUNT; + printf("Requested FIFO frames : %d\n", accel_frames_req); + rslt = bma400_extract_accel(&fifo_frame, accel_data, &accel_frames_req, &bma); bma400_check_rslt("bma400_extract_accel", rslt); @@ -129,24 +137,14 @@ int main(int argc, char const *argv[]) { printf("Extracted FIFO frames : %d\n", accel_frames_req); - printf("Accel data in LSB units and Gravity data in m/s^2\n"); - for (index = 0; index < accel_frames_req; index++) { /* 12-bit accelerometer at range 2G */ - printf("Accel[%d] X : %d raw LSB Y : %d raw LSB Z : %d raw LSB\n", + printf("Accel[%d] Raw_X : %d Raw_Y : %d Raw_Z : %d \n", index, accel_data[index].x, accel_data[index].y, accel_data[index].z); - - /* 12-bit accelerometer at range 2G */ - x = lsb_to_ms2(accel_data[index].x, 2, 12); - y = lsb_to_ms2(accel_data[index].y, 2, 12); - z = lsb_to_ms2(accel_data[index].z, 2, 12); - - /* Print the data in m/s2. */ - printf("\t Gravity-x = %4.2f, Gravity-y = %4.2f, Gravity-z = %4.2f\n", x, y, z); } } @@ -183,15 +181,3 @@ int main(int argc, char const *argv[]) return rslt; } - -static float lsb_to_ms2(int16_t accel_data, uint8_t g_range, uint8_t bit_width) -{ - float accel_ms2; - int16_t half_scale; - - half_scale = 1 << (bit_width - 1); - accel_ms2 = (GRAVITY_EARTH * accel_data * g_range) / half_scale; - - return accel_ms2; - -} diff --git a/examples/fifo_watermark_xyz_data/fifo_watermark_xyz_data.c b/examples/fifo_watermark_xyz_data/fifo_watermark_xyz_data.c index 3371080..5592e5a 100644 --- a/examples/fifo_watermark_xyz_data/fifo_watermark_xyz_data.c +++ b/examples/fifo_watermark_xyz_data/fifo_watermark_xyz_data.c @@ -5,27 +5,33 @@ * */ -/*! - * @ingroup bma400Examples - * @defgroup bma400ExamplesFifo FIFO watermark read - * @brief Read and extract FIFO watermark data - * \include fifo_watermark_xyz_data.c - */ - #include #include "bma400.h" #include "common.h" -/* Earth's gravity in m/s^2 */ -#define GRAVITY_EARTH (9.80665f) +/************************************************************************/ +/********* Macros *************/ +/************************************************************************/ -/* Total number of frames */ -#define N_FRAMES 200 +/*! Setting a watermark level in FIFO */ +#define FIFO_WATERMARK_LEVEL UINT16_C(650) + +/* Total FIFO buffer size */ +#define FIFO_FULL_SIZE UINT16_C(1024) /* Add extra bytes to get complete fifo data */ -#define FIFO_SIZE (N_FRAMES + BMA400_FIFO_BYTES_OVERREAD) +#define FIFO_SIZE (FIFO_FULL_SIZE + BMA400_FIFO_BYTES_OVERREAD) -static float lsb_to_ms2(int16_t accel_data, uint8_t g_range, uint8_t bit_width); +/*! Number of accel frames to be extracted from FIFO + * Calculation: + * fifo_watermark_level = 650, accel_frame_len = 6, header_byte = 1. + * fifo_accel_frame_count = (650 / (6 + 1)) = 93 frames + */ +#define FIFO_ACCEL_FRAME_COUNT UINT8_C(93) + +/************************************************************************/ +/********* Main Function *************/ +/************************************************************************/ int main(int argc, char const *argv[]) { @@ -33,15 +39,14 @@ int main(int argc, char const *argv[]) uint16_t index; - struct bma400_sensor_data accel_data[N_FRAMES] = { { 0 } }; + struct bma400_fifo_sensor_data accel_data[FIFO_ACCEL_FRAME_COUNT] = { { 0 } }; struct bma400_int_enable int_en; struct bma400_fifo_data fifo_frame; struct bma400_device_conf fifo_conf; struct bma400_sensor_conf conf; uint16_t int_status = 0; uint8_t fifo_buff[FIFO_SIZE] = { 0 }; - uint16_t accel_frames_req = N_FRAMES; - float x, y, z; + uint16_t accel_frames_req = FIFO_ACCEL_FRAME_COUNT; uint8_t try = 1; struct bma400_dev bma; @@ -53,14 +58,12 @@ int main(int argc, char const *argv[]) rslt = bma400_interface_init(&bma, BMA400_I2C_INTF); bma400_check_rslt("bma400_interface_init", rslt); - printf("Read FIFO watermark interrupt XYZ data\n"); + rslt = bma400_init(&bma); + bma400_check_rslt("bma400_init", rslt); rslt = bma400_soft_reset(&bma); bma400_check_rslt("bma400_soft_reset", rslt); - rslt = bma400_init(&bma); - bma400_check_rslt("bma400_init", rslt); - /* Select the type of configuration to be modified */ conf.type = BMA400_ACCEL; @@ -85,7 +88,7 @@ int main(int argc, char const *argv[]) fifo_conf.param.fifo_conf.conf_regs = BMA400_FIFO_X_EN | BMA400_FIFO_Y_EN | BMA400_FIFO_Z_EN; fifo_conf.param.fifo_conf.conf_status = BMA400_ENABLE; - fifo_conf.param.fifo_conf.fifo_watermark = 200; + fifo_conf.param.fifo_conf.fifo_watermark = FIFO_WATERMARK_LEVEL; fifo_conf.param.fifo_conf.fifo_wm_channel = BMA400_INT_CHANNEL_2; rslt = bma400_set_device_conf(&fifo_conf, 1, &bma); @@ -103,7 +106,9 @@ int main(int argc, char const *argv[]) rslt = bma400_enable_interrupt(&int_en, 1, &bma); bma400_check_rslt("bma400_enable_interrupt", rslt); - while (try <= 25) + printf("Read FIFO watermark interrupt XYZ data\n"); + + while (try <= 10) { rslt = bma400_get_interrupt_status(&int_status, &bma); bma400_check_rslt("bma400_get_interrupt_status", rslt); @@ -112,6 +117,13 @@ int main(int argc, char const *argv[]) { printf("\n\nIteration : %d\n\n", try); + fifo_frame.length = FIFO_SIZE; + + rslt = bma400_get_device_conf(&fifo_conf, 1, &bma); + bma400_check_rslt("bma400_set_device_conf", rslt); + + printf("Watermark level : %d\n", fifo_conf.param.fifo_conf.fifo_watermark); + printf("Requested FIFO length : %d\n", fifo_frame.length); rslt = bma400_get_fifo_data(&fifo_frame, &bma); @@ -119,7 +131,7 @@ int main(int argc, char const *argv[]) printf("Available FIFO length : %d\n", fifo_frame.length); - accel_frames_req = N_FRAMES; + accel_frames_req = FIFO_ACCEL_FRAME_COUNT; rslt = bma400_extract_accel(&fifo_frame, accel_data, &accel_frames_req, &bma); bma400_check_rslt("bma400_extract_accel", rslt); @@ -127,24 +139,14 @@ int main(int argc, char const *argv[]) { printf("Extracted FIFO frames : %d\n", accel_frames_req); - printf("Accel data in LSB units and Gravity data in m/s^2\n"); - for (index = 0; index < accel_frames_req; index++) { /* 12-bit accelerometer at range 2G */ - printf("Accel[%d] X : %d raw LSB Y : %d raw LSB Z : %d raw LSB\n", + printf("Accel[%d] Raw_X : %d Raw_Y : %d Raw_Z : %d \n", index, accel_data[index].x, accel_data[index].y, accel_data[index].z); - - /* 12-bit accelerometer at range 2G */ - x = lsb_to_ms2(accel_data[index].x, 2, 12); - y = lsb_to_ms2(accel_data[index].y, 2, 12); - z = lsb_to_ms2(accel_data[index].z, 2, 12); - - /* Print the data in m/s2. */ - printf("\t Gravity-x = %4.2f, Gravity-y = %4.2f, Gravity-z = %4.2f\n", x, y, z); } } @@ -176,15 +178,3 @@ int main(int argc, char const *argv[]) return rslt; } - -static float lsb_to_ms2(int16_t accel_data, uint8_t g_range, uint8_t bit_width) -{ - float accel_ms2; - int16_t half_scale; - - half_scale = 1 << (bit_width - 1); - accel_ms2 = (GRAVITY_EARTH * accel_data * g_range) / half_scale; - - return accel_ms2; - -} diff --git a/examples/fifo_watermark_xyz_data_sensortime/fifo_watermark_xyz_data_sensortime.c b/examples/fifo_watermark_xyz_data_sensortime/fifo_watermark_xyz_data_sensortime.c index 23779a0..716a404 100644 --- a/examples/fifo_watermark_xyz_data_sensortime/fifo_watermark_xyz_data_sensortime.c +++ b/examples/fifo_watermark_xyz_data_sensortime/fifo_watermark_xyz_data_sensortime.c @@ -5,30 +5,37 @@ * */ -/*! - * @ingroup bma400Examples - * @defgroup bma400ExamplesFifo FIFO watermark read with sensortime - * @brief Read and extract FIFO watermark data with sensortime - * \include fifo_watermark_xyz_data_sensortime.c - */ - #include #include "bma400.h" #include "common.h" -/* Earth's gravity in m/s^2 */ -#define GRAVITY_EARTH (9.80665f) +/************************************************************************/ +/********* Macros *************/ +/************************************************************************/ /* 39.0625us per tick */ -#define SENSOR_TICK_TO_S (0.0000390625f) +#define SENSOR_TICK_TO_S (0.0000390625f) + +/*! Setting a watermark level in FIFO */ +#define FIFO_WATERMARK_LEVEL UINT16_C(650) -/* Total number of frames */ -#define N_FRAMES 200 +/* Total FIFO buffer size */ +#define FIFO_FULL_SIZE UINT16_C(1024) /* Add extra bytes to get complete fifo data */ -#define FIFO_SIZE (N_FRAMES + BMA400_FIFO_BYTES_OVERREAD) +#define FIFO_SIZE (FIFO_FULL_SIZE + BMA400_FIFO_BYTES_OVERREAD) + +/*! Number of accel frames to be extracted from FIFO + * Calculation: + * fifo_watermark_level = 650, accel_frame_len = 6, header_byte = 1. + * fifo_accel_frame_count = (650 / (6 + 1)) = 93 frames + * NOTE: Extra frames are read in order to get sensor time + */ +#define FIFO_ACCEL_FRAME_COUNT UINT8_C(150) -static float lsb_to_ms2(int16_t accel_data, uint8_t g_range, uint8_t bit_width); +/************************************************************************/ +/********* Main Function *************/ +/************************************************************************/ int main(int argc, char const *argv[]) { @@ -36,15 +43,14 @@ int main(int argc, char const *argv[]) uint16_t index; - struct bma400_sensor_data accel_data[N_FRAMES] = { { 0 } }; + struct bma400_fifo_sensor_data accel_data[FIFO_ACCEL_FRAME_COUNT] = { { 0 } }; struct bma400_int_enable int_en; struct bma400_fifo_data fifo_frame; struct bma400_device_conf fifo_conf; struct bma400_sensor_conf conf; uint16_t int_status = 0; uint8_t fifo_buff[FIFO_SIZE] = { 0 }; - uint16_t accel_frames_req = N_FRAMES; - float x, y, z; + uint16_t accel_frames_req = FIFO_ACCEL_FRAME_COUNT; uint8_t try = 1; struct bma400_dev bma; @@ -56,14 +62,12 @@ int main(int argc, char const *argv[]) rslt = bma400_interface_init(&bma, BMA400_I2C_INTF); bma400_check_rslt("bma400_interface_init", rslt); - printf("Read FIFO watermark interrupt XYZ data with sensortime\n"); + rslt = bma400_init(&bma); + bma400_check_rslt("bma400_init", rslt); rslt = bma400_soft_reset(&bma); bma400_check_rslt("bma400_soft_reset", rslt); - rslt = bma400_init(&bma); - bma400_check_rslt("bma400_init", rslt); - /* Select the type of configuration to be modified */ conf.type = BMA400_ACCEL; @@ -86,27 +90,26 @@ int main(int argc, char const *argv[]) rslt = bma400_get_device_conf(&fifo_conf, 1, &bma); bma400_check_rslt("bma400_get_device_conf", rslt); + rslt = bma400_set_power_mode(BMA400_MODE_NORMAL, &bma); + bma400_check_rslt("bma400_set_power_mode", rslt); + fifo_conf.param.fifo_conf.conf_regs = BMA400_FIFO_X_EN | BMA400_FIFO_Y_EN | BMA400_FIFO_Z_EN | BMA400_FIFO_TIME_EN; fifo_conf.param.fifo_conf.conf_status = BMA400_ENABLE; - fifo_conf.param.fifo_conf.fifo_watermark = 200; + fifo_conf.param.fifo_conf.fifo_watermark = FIFO_WATERMARK_LEVEL; fifo_conf.param.fifo_conf.fifo_wm_channel = BMA400_INT_CHANNEL_2; rslt = bma400_set_device_conf(&fifo_conf, 1, &bma); bma400_check_rslt("bma400_set_device_conf", rslt); - rslt = bma400_set_power_mode(BMA400_MODE_NORMAL, &bma); - bma400_check_rslt("bma400_set_power_mode", rslt); - - fifo_frame.data = fifo_buff; - fifo_frame.length = FIFO_SIZE; - int_en.type = BMA400_FIFO_WM_INT_EN; int_en.conf = BMA400_ENABLE; rslt = bma400_enable_interrupt(&int_en, 1, &bma); bma400_check_rslt("bma400_enable_interrupt", rslt); - while (try <= 25) + printf("Read FIFO watermark interrupt XYZ data with sensortime\n"); + + while (try <= 10) { rslt = bma400_get_interrupt_status(&int_status, &bma); bma400_check_rslt("bma400_get_interrupt_status", rslt); @@ -115,6 +118,14 @@ int main(int argc, char const *argv[]) { printf("\n\nIteration : %d\n\n", try); + fifo_frame.data = fifo_buff; + fifo_frame.length = FIFO_SIZE; + + rslt = bma400_get_device_conf(&fifo_conf, 1, &bma); + bma400_check_rslt("bma400_set_device_conf", rslt); + + printf("Watermark level : %d\n", fifo_conf.param.fifo_conf.fifo_watermark); + printf("Requested FIFO length : %d\n", fifo_frame.length); rslt = bma400_get_fifo_data(&fifo_frame, &bma); @@ -122,7 +133,9 @@ int main(int argc, char const *argv[]) printf("Available FIFO length : %d\n", fifo_frame.length); - accel_frames_req = N_FRAMES; + accel_frames_req = FIFO_ACCEL_FRAME_COUNT; + printf("Requested FIFO frames : %d\n", accel_frames_req); + rslt = bma400_extract_accel(&fifo_frame, accel_data, &accel_frames_req, &bma); bma400_check_rslt("bma400_extract_accel", rslt); @@ -130,24 +143,14 @@ int main(int argc, char const *argv[]) { printf("Extracted FIFO frames : %d\n", accel_frames_req); - printf("Accel data in LSB units and Gravity data in m/s^2\n"); - for (index = 0; index < accel_frames_req; index++) { /* 12-bit accelerometer at range 2G */ - printf("Accel[%d] X : %d raw LSB Y : %d raw LSB Z : %d raw LSB\n", + printf("Accel[%d] Raw_X : %d Raw_Y : %d Raw_Z : %d \n", index, accel_data[index].x, accel_data[index].y, accel_data[index].z); - - /* 12-bit accelerometer at range 2G */ - x = lsb_to_ms2(accel_data[index].x, 2, 12); - y = lsb_to_ms2(accel_data[index].y, 2, 12); - z = lsb_to_ms2(accel_data[index].z, 2, 12); - - /* Print the data in m/s2. */ - printf("\t Gravity-x = %4.2f, Gravity-y = %4.2f, Gravity-z = %4.2f\n", x, y, z); } } @@ -184,15 +187,3 @@ int main(int argc, char const *argv[]) return rslt; } - -static float lsb_to_ms2(int16_t accel_data, uint8_t g_range, uint8_t bit_width) -{ - float accel_ms2; - int16_t half_scale; - - half_scale = 1 << (bit_width - 1); - accel_ms2 = (GRAVITY_EARTH * accel_data * g_range) / half_scale; - - return accel_ms2; - -} diff --git a/examples/orientation/orientation.c b/examples/orientation/orientation.c index dfd52bd..65cb6b1 100644 --- a/examples/orientation/orientation.c +++ b/examples/orientation/orientation.c @@ -5,22 +5,25 @@ * */ -/*! - * @ingroup bma400Examples - * @defgroup bma400ExamplesOrientation Orientation - * @brief To showcase orientation feature - * \include orientation.c - */ - #include #include "bma400.h" #include "common.h" +/************************************************************************/ +/********* Macros *************/ +/************************************************************************/ + /* Macro to determine count of activity change for each axis */ #define BMA400_INT_COUNTER UINT8_C(5) +/************************************************************************/ +/********* Static APIs *************/ +/************************************************************************/ + /* orient_feature interrupts */ -static void test_bma400_orient_feature_int(struct bma400_orient_int_conf test_orient_conf, struct bma400_dev *dev) +static void test_bma400_orient_feature_int(uint8_t combination, + struct bma400_orient_int_conf test_orient_conf, + struct bma400_dev *dev) { int8_t rslt = 0; @@ -115,17 +118,22 @@ static void test_bma400_orient_feature_int(struct bma400_orient_int_conf test_or /* Loop breaker */ if (orient_cnter >= BMA400_INT_COUNTER) { - printf("Orientation interrupt test done. Exiting!\n"); + printf("\nOrientation interrupt test for Combination %d done\n\n", combination); break; } } } +/************************************************************************/ +/********* Main Function *************/ +/************************************************************************/ + int main(int argc, char const *argv[]) { struct bma400_dev bma; int8_t rslt = 0; + uint8_t combination; struct bma400_orient_int_conf test_orient_conf = { 0 }; @@ -133,16 +141,17 @@ int main(int argc, char const *argv[]) * For I2C : BMA400_I2C_INTF * For SPI : BMA400_SPI_INTF */ - rslt = bma400_interface_init(&bma, BMA400_SPI_INTF); + rslt = bma400_interface_init(&bma, BMA400_I2C_INTF); bma400_check_rslt("bma400_interface_init", rslt); - rslt = bma400_soft_reset(&bma); - bma400_check_rslt("bma400_soft_reset", rslt); - rslt = bma400_init(&bma); bma400_check_rslt("bma400_init", rslt); - printf("Orient change interrupt with XYZ Axes enabled\n"); + rslt = bma400_soft_reset(&bma); + bma400_check_rslt("bma400_soft_reset", rslt); + + combination = 1; + printf("Combination %d : Orient change interrupt with XYZ Axes enabled\n\n", combination); test_orient_conf.axes_sel = BMA400_AXIS_XYZ_EN; test_orient_conf.data_src = BMA400_DATA_SRC_ACC_FILT1; test_orient_conf.int_chan = BMA400_INT_CHANNEL_2; @@ -151,9 +160,10 @@ int main(int argc, char const *argv[]) test_orient_conf.ref_update = BMA400_ORIENT_REFU_ACC_FILT_2; test_orient_conf.stability_thres = 10; /* 1 LSB = 8mg */ - test_bma400_orient_feature_int(test_orient_conf, &bma); + test_bma400_orient_feature_int(combination, test_orient_conf, &bma); - printf("Orient change interrupt with Y Axis enabled\n"); + combination = 2; + printf("Combination %d : Orient change interrupt with Y Axis enabled\n\n", combination); test_orient_conf.axes_sel = BMA400_AXIS_Y_EN; test_orient_conf.data_src = BMA400_DATA_SRC_ACC_FILT2; test_orient_conf.int_chan = BMA400_UNMAP_INT_PIN; @@ -161,9 +171,10 @@ int main(int argc, char const *argv[]) test_orient_conf.orient_thres = 125; /* 1 LSB = 8mg */ test_orient_conf.stability_thres = 10; /* 1 LSB = 8mg */ - test_bma400_orient_feature_int(test_orient_conf, &bma); + test_bma400_orient_feature_int(combination, test_orient_conf, &bma); - printf("Orient change interrupt with X Axis enabled\n"); + combination = 3; + printf("Combination %d : Orient change interrupt with X Axis enabled\n\n", combination); test_orient_conf.axes_sel = BMA400_AXIS_X_EN; test_orient_conf.data_src = BMA400_DATA_SRC_ACC_FILT2; test_orient_conf.int_chan = BMA400_MAP_BOTH_INT_PINS; @@ -172,9 +183,10 @@ int main(int argc, char const *argv[]) test_orient_conf.ref_update = BMA400_ORIENT_REFU_ACC_FILT_2; test_orient_conf.stability_thres = 10; /* 1 LSB = 8mg */ - test_bma400_orient_feature_int(test_orient_conf, &bma); + test_bma400_orient_feature_int(combination, test_orient_conf, &bma); - printf("Orient change interrupt with Z Axis enabled\n"); + combination = 4; + printf("Combination %d : Orient change interrupt with Z Axis enabled\n\n", combination); test_orient_conf.axes_sel = BMA400_AXIS_Z_EN; test_orient_conf.data_src = BMA400_DATA_SRC_ACC_FILT2; test_orient_conf.int_chan = BMA400_INT_CHANNEL_1; @@ -183,11 +195,12 @@ int main(int argc, char const *argv[]) test_orient_conf.ref_update = BMA400_ORIENT_REFU_ACC_FILT_2; test_orient_conf.stability_thres = 10; /* 1 LSB = 8mg */ - test_bma400_orient_feature_int(test_orient_conf, &bma); + test_bma400_orient_feature_int(combination, test_orient_conf, &bma); /* Manual update of ref value is reflected while we read only when we enable that specific axes */ - printf("Orient change interrupt with Z Axis enabled and manual update\n"); + combination = 5; + printf("Combination %d : Orient change interrupt with Z Axis enabled and manual update\n\n", combination); test_orient_conf.axes_sel = BMA400_AXIS_Z_EN; test_orient_conf.data_src = BMA400_DATA_SRC_ACC_FILT2; test_orient_conf.int_chan = BMA400_INT_CHANNEL_1; @@ -199,7 +212,7 @@ int main(int argc, char const *argv[]) test_orient_conf.orient_ref_y = 300; test_orient_conf.orient_ref_z = 2000; - test_bma400_orient_feature_int(test_orient_conf, &bma); + test_bma400_orient_feature_int(combination, test_orient_conf, &bma); bma400_coines_deinit(); diff --git a/examples/selftest/selftest.c b/examples/selftest/selftest.c index 4375139..9b7aa24 100644 --- a/examples/selftest/selftest.c +++ b/examples/selftest/selftest.c @@ -5,13 +5,6 @@ * */ -/*! - * @ingroup bma400Examples - * @defgroup bma400ExamplesSelfTest Self test - * @brief Perform accelerometer self test - * \include selftest.c - */ - #include #include "bma400.h" #include "common.h" diff --git a/examples/step_counter/step_counter.c b/examples/step_counter/step_counter.c index e1cc50c..96fe6a9 100644 --- a/examples/step_counter/step_counter.c +++ b/examples/step_counter/step_counter.c @@ -5,13 +5,6 @@ * */ -/*! - * @ingroup bma400Examples - * @defgroup bma400ExamplesStepCounter Step counter - * @brief To showcase step counter feature - * \include bma400_step_counter.c - */ - #include #include "bma400.h" #include "common.h" @@ -38,12 +31,12 @@ int main(int argc, char const *argv[]) rslt = bma400_interface_init(&bma, BMA400_I2C_INTF); bma400_check_rslt("bma400_interface_init", rslt); - rslt = bma400_soft_reset(&bma); - bma400_check_rslt("bma400_soft_reset", rslt); - rslt = bma400_init(&bma); bma400_check_rslt("bma400_init", rslt); + rslt = bma400_soft_reset(&bma); + bma400_check_rslt("bma400_soft_reset", rslt); + accel_settin[0].type = BMA400_STEP_COUNTER_INT; accel_settin[1].type = BMA400_ACCEL; @@ -107,6 +100,7 @@ int main(int argc, char const *argv[]) } if (count == 0) { + printf("Step counter testing done. Exiting !\n"); break; } } diff --git a/examples/tap_detection/tap_detection.c b/examples/tap_detection/tap_detection.c index 0fdb059..b82c777 100644 --- a/examples/tap_detection/tap_detection.c +++ b/examples/tap_detection/tap_detection.c @@ -5,13 +5,6 @@ * */ -/*! - * @ingroup bma400Examples - * @defgroup bma400ExamplesTapDetection Tap detection - * @brief To showcase tap detection feature - * \include tap_detection.c - */ - #include #include "bma400.h" #include "common.h" @@ -31,15 +24,15 @@ int main(int argc, char const *argv[]) * For I2C : BMA400_I2C_INTF * For SPI : BMA400_SPI_INTF */ - rslt = bma400_interface_init(&bma, BMA400_SPI_INTF); + rslt = bma400_interface_init(&bma, BMA400_I2C_INTF); bma400_check_rslt("bma400_interface_init", rslt); - rslt = bma400_soft_reset(&bma); - bma400_check_rslt("bma400_soft_reset", rslt); - rslt = bma400_init(&bma); bma400_check_rslt("bma400_init", rslt); + rslt = bma400_soft_reset(&bma); + bma400_check_rslt("bma400_soft_reset", rslt); + conf[0].type = BMA400_ACCEL; conf[1].type = BMA400_TAP_INT; @@ -78,6 +71,9 @@ int main(int argc, char const *argv[]) while (1) { + /* Delay given to give user certain time to provide tap movement */ + bma.delay_us(10000, bma.intf_ptr); + rslt = bma400_get_interrupt_status(&int_status, &bma); bma400_check_rslt("bma400_get_interrupt_status", rslt);