void main(void) { struct device *bmg160; #if defined(CONFIG_BMG160_GYRO_RANGE_RUNTIME) struct sensor_value attr; #endif bmg160 = device_get_binding("bmg160"); if (!bmg160) { printf("Device not found.\n"); return; } #if defined(CONFIG_BMG160_GYRO_RANGE_RUNTIME) /* * Set gyro range to +/- 250 degrees/s. Since the sensor API needs SI * units, convert the range to rad/s. */ sensor_degrees_to_rad(250, &attr); if (sensor_attr_set(bmg160, SENSOR_CHAN_GYRO_ANY, SENSOR_ATTR_FULL_SCALE, &attr) < 0) { printf("Cannot set gyro range.\n"); return; } #endif printf("Testing the polling mode.\n"); test_polling_mode(bmg160); printf("Polling mode test finished.\n"); printf("Testing the trigger mode.\n"); test_trigger_mode(bmg160); printf("Trigger mode test finished.\n"); }
static void test_trigger_mode(struct device *bmg160) { uint32_t timer_data[2] = {0, 0}; int32_t remaining_test_time = MAX_TEST_TIME; struct nano_timer timer; struct sensor_trigger trig; struct sensor_value attr; nano_timer_init(&timer, timer_data); trig.type = SENSOR_TRIG_DELTA; trig.chan = SENSOR_CHAN_GYRO_ANY; printf("Gyro: Testing anymotion trigger.\n"); /* set up the trigger */ /* set slope threshold to 10 dps */ sensor_degrees_to_rad(10, &attr); /* convert to rad/s */ if (sensor_attr_set(bmg160, SENSOR_CHAN_GYRO_ANY, SENSOR_ATTR_SLOPE_TH, &attr) < 0) { printf("Gyro: cannot set slope threshold.\n"); return; } /* set slope duration to 4 samples */ attr.type = SENSOR_VALUE_TYPE_INT; attr.val1 = 4; if (sensor_attr_set(bmg160, SENSOR_CHAN_GYRO_ANY, SENSOR_ATTR_SLOPE_DUR, &attr) < 0) { printf("Gyro: cannot set slope duration.\n"); return; } if (sensor_trigger_set(bmg160, &trig, trigger_handler) < 0) { printf("Gyro: cannot set trigger.\n"); return; } printf("Gyro: rotate the device and wait for events.\n"); do { nano_task_timer_start(&timer, SLEEPTIME); nano_task_timer_test(&timer, TICKS_UNLIMITED); remaining_test_time -= SLEEPTIME; } while (remaining_test_time > 0); if (sensor_trigger_set(bmg160, &trig, NULL) < 0) { printf("Gyro: cannot clear trigger.\n"); return; } printf("Gyro: Anymotion trigger test finished.\n"); printf("Gyro: Testing data ready trigger.\n"); attr.type = SENSOR_VALUE_TYPE_INT; attr.val1 = 100; attr.val2 = 0; if (sensor_attr_set(bmg160, SENSOR_CHAN_GYRO_ANY, SENSOR_ATTR_SAMPLING_FREQUENCY, &attr) < 0) { printf("Gyro: cannot set sampling frequency.\n"); return; } trig.type = SENSOR_TRIG_DATA_READY; trig.chan = SENSOR_CHAN_GYRO_ANY; if (sensor_trigger_set(bmg160, &trig, trigger_handler) < 0) { printf("Gyro: cannot set trigger.\n"); return; } remaining_test_time = MAX_TEST_TIME; do { nano_task_timer_start(&timer, SLEEPTIME); nano_task_timer_test(&timer, TICKS_UNLIMITED); remaining_test_time -= SLEEPTIME; } while (remaining_test_time > 0); if (sensor_trigger_set(bmg160, &trig, NULL) < 0) { printf("Gyro: cannot clear trigger.\n"); return; } printf("Gyro: Data ready trigger test finished.\n"); }
void main(void) { struct device *bmi160; #if defined(CONFIG_BMI160_ACCEL_RANGE_RUNTIME) ||\ defined(CONFIG_BMI160_GYRO_RANGE_RUNTIME) struct sensor_value attr; #endif printk("IMU: Binding...\n"); bmi160 = device_get_binding(CONFIG_BMI160_NAME); if (!bmi160) { printk("Gyro: Device not found.\n"); return; } #if defined(CONFIG_BMI160_ACCEL_RANGE_RUNTIME) /* * Set accelerometer range to +/- 16G. Since the sensor API needs SI * units, convert the range to m/s^2. */ sensor_g_to_ms2(16, &attr); if (sensor_attr_set(bmi160, SENSOR_CHAN_ACCEL_XYZ, SENSOR_ATTR_FULL_SCALE, &attr) < 0) { printk("Cannot set accelerometer range.\n"); return; } #endif #if defined(CONFIG_BMI160_GYRO_RANGE_RUNTIME) /* * Set gyro range to +/- 250 degrees/s. Since the sensor API needs SI * units, convert the range to rad/s. */ sensor_degrees_to_rad(250, &attr); if (sensor_attr_set(bmi160, SENSOR_CHAN_GYRO_XYZ, SENSOR_ATTR_FULL_SCALE, &attr) < 0) { printk("Cannot set gyro range.\n"); return; } #endif #ifdef PERFORM_MANUAL_CALIBRATION /* manually adjust accelerometer and gyro offsets */ if (manual_calibration(bmi160) < 0) { printk("Manual calibration failed.\n"); return; } #endif #ifdef PERFORM_AUTO_CALIBRATION /* auto calibrate accelerometer and gyro */ if (auto_calibration(bmi160) < 0) { printk("HW calibration failed.\n"); return; } #endif printk("Testing the polling mode.\n"); test_polling_mode(bmi160); printk("Testing the polling mode finished.\n"); #ifdef CONFIG_BMI160_TRIGGER printk("Testing the trigger mode.\n"); test_trigger_mode(bmi160); printk("Testing the trigger mode finished.\n"); #endif }