static void test_trigger_mode(struct device *bmi160) { struct sensor_value attr; #if defined(CONFIG_BMI160_ACCEL_ODR_RUNTIME) /* set sampling frequency to 100Hz for accel */ attr.val1 = 100; attr.val2 = 0; if (sensor_attr_set(bmi160, SENSOR_CHAN_ACCEL_XYZ, SENSOR_ATTR_SAMPLING_FREQUENCY, &attr) < 0) { printk("Cannot set sampling frequency for accelerometer.\n"); return; } #endif #if defined(CONFIG_BMI160_GYRO_ODR_RUNTIME) /* set sampling frequency to 100Hz for gyro */ attr.val1 = 100; attr.val2 = 0; if (sensor_attr_set(bmi160, SENSOR_CHAN_GYRO_XYZ, SENSOR_ATTR_SAMPLING_FREQUENCY, &attr) < 0) { printk("Cannot set sampling frequency for gyroscope.\n"); return; } #endif test_anymotion_trigger(bmi160); test_data_ready_trigger(bmi160); }
static void test_anymotion_trigger(struct device *bmi160) { s32_t remaining_test_time = MAX_TEST_TIME; struct sensor_value attr; struct sensor_trigger trig; /* set up anymotion trigger */ /* * Set slope threshold to 0.1G (0.1 * 9.80665 = 4.903325 m/s^2). * This depends on the chosen range. One cannot choose a threshold * bigger than half the range. For example, for a 16G range, the * threshold must not exceed 8G. */ attr.val1 = 0; attr.val2 = 980665; if (sensor_attr_set(bmi160, SENSOR_CHAN_ACCEL_XYZ, SENSOR_ATTR_SLOPE_TH, &attr) < 0) { printk("Cannot set anymotion slope threshold.\n"); return; } /* * Set slope duration to 2 consecutive samples (after which the * anymotion interrupt will trigger. * * Allowed values are from 1 to 4. */ attr.val1 = 2; attr.val2 = 0; if (sensor_attr_set(bmi160, SENSOR_CHAN_ACCEL_XYZ, SENSOR_ATTR_SLOPE_DUR, &attr) < 0) { printk("Cannot set anymotion slope duration.\n"); return; } /* enable anymotion trigger */ trig.type = SENSOR_TRIG_DELTA; trig.chan = SENSOR_CHAN_ACCEL_XYZ; if (sensor_trigger_set(bmi160, &trig, trigger_hdlr) < 0) { printk("Cannot enable anymotion trigger.\n"); return; } printk("Anymotion test: shake the device to get anymotion events.\n"); do { /* wait a while */ k_sleep(SLEEPTIME); remaining_test_time -= SLEEPTIME; } while (remaining_test_time > 0); printk("Anymotion test: finished, removing anymotion trigger...\n"); if (sensor_trigger_set(bmi160, &trig, NULL) < 0) { printk("Cannot remove anymotion trigger.\n"); return; } }
static void test_polling_mode(struct device *bmi160) { s32_t remaining_test_time = MAX_TEST_TIME; struct sensor_value attr; #if defined(CONFIG_BMI160_ACCEL_ODR_RUNTIME) /* set sampling frequency to 100Hz for accel */ attr.val1 = 100; attr.val2 = 0; if (sensor_attr_set(bmi160, SENSOR_CHAN_ACCEL_XYZ, SENSOR_ATTR_SAMPLING_FREQUENCY, &attr) < 0) { printk("Cannot set sampling frequency for accelerometer.\n"); return; } #endif #if defined(CONFIG_BMI160_GYRO_ODR_RUNTIME) /* set sampling frequency to 3200Hz for gyro */ attr.val1 = 3200; attr.val2 = 0; if (sensor_attr_set(bmi160, SENSOR_CHAN_GYRO_XYZ, SENSOR_ATTR_SAMPLING_FREQUENCY, &attr) < 0) { printk("Cannot set sampling frequency for gyroscope.\n"); return; } #endif /* wait for the change to take effect */ k_sleep(SLEEPTIME); /* poll the data and print it */ do { if (sensor_sample_fetch(bmi160) < 0) { printk("Sample update error.\n"); return; } #if !defined(CONFIG_BMI160_GYRO_PMU_SUSPEND) print_gyro_data(bmi160); #endif #if !defined(CONFIG_BMI160_ACCEL_PMU_SUSPEND) print_accel_data(bmi160); #endif print_temp_data(bmi160); /* wait a while */ k_sleep(SLEEPTIME); remaining_test_time -= SLEEPTIME; } while (remaining_test_time > 0); }
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 do_main(struct device *dev) { int ret; struct sensor_value temp_value; struct sensor_value attr; attr.type = SENSOR_VALUE_TYPE_INT_PLUS_MICRO; attr.val1 = 150; attr.val2 = 0; ret = sensor_attr_set(dev, SENSOR_CHAN_TEMP, SENSOR_ATTR_FULL_SCALE, &attr); if (ret) { printk("sensor_attr_set failed ret %d\n", ret); return; } attr.type = SENSOR_VALUE_TYPE_INT_PLUS_MICRO; attr.val1 = 8; attr.val2 = 0; ret = sensor_attr_set(dev, SENSOR_CHAN_TEMP, SENSOR_ATTR_SAMPLING_FREQUENCY, &attr); if (ret) { printk("sensor_attr_set failed ret %d\n", ret); return; } while (1) { ret = sensor_sample_fetch(dev); if (ret) { printk("sensor_sample_fetch failed ret %d\n", ret); return; } ret = sensor_channel_get(dev, SENSOR_CHAN_TEMP, &temp_value); if (ret) { printk("sensor_channel_get failed ret %d\n", ret); return; } printk("temp is %d (%d micro)\n", temp_value.val1, temp_value.val2); k_sleep(1000); } }
static int manual_calibration(struct device *bmi160) { #if !defined(CONFIG_BMI160_ACCEL_PMU_SUSPEND) /* set accelerometer offsets */ if (sensor_attr_set(bmi160, SENSOR_CHAN_ACCEL_XYZ, SENSOR_ATTR_OFFSET, accel_offsets) < 0) { return -EIO; } #endif #if !defined(CONFIG_BMI160_GYRO_PMU_SUSPEND) /* set gyroscope offsets */ if (sensor_attr_set(bmi160, SENSOR_CHAN_GYRO_XYZ, SENSOR_ATTR_OFFSET, gyro_offsets) < 0) { return -EIO; } #endif return 0; }
void main(void) { struct device *dev = device_get_binding("MCP9808"); if (dev == NULL) { printf("device not found. aborting test.\n"); return; } #ifdef DEBUG printf("dev %p\n", dev); printf("dev %p name %s\n", dev, dev->config->name); #endif #ifdef CONFIG_MCP9808_TRIGGER struct sensor_value val; struct sensor_trigger trig; val.type = SENSOR_VALUE_TYPE_INT_PLUS_MICRO; val.val1 = 26; val.val2 = 0; sensor_attr_set(dev, SENSOR_CHAN_TEMP, SENSOR_ATTR_UPPER_THRESH, &val); trig.type = SENSOR_TRIG_THRESHOLD; trig.chan = SENSOR_CHAN_TEMP; sensor_trigger_set(dev, &trig, trigger_handler); #endif while (1) { struct sensor_value temp; int rc; rc = sensor_sample_fetch(dev); if (rc != 0) { printf("sensor_sample_fetch error: %d\n", rc); break; } rc = sensor_channel_get(dev, SENSOR_CHAN_TEMP, &temp); if (rc != 0) { printf("sensor_channel_get error: %d\n", rc); break; } printf("temp: %d.%06d\n", temp.val1, temp.val2); k_sleep(2000); } }
static int auto_calibration(struct device *bmi160) { #if !defined(CONFIG_BMI160_ACCEL_PMU_SUSPEND) /* calibrate accelerometer */ if (sensor_attr_set(bmi160, SENSOR_CHAN_ACCEL_XYZ, SENSOR_ATTR_CALIB_TARGET, acc_calib) < 0) { return -EIO; } #endif #if !defined(CONFIG_BMI160_GYRO_PMU_SUSPEND) /* * Calibrate gyro. No calibration value needs to be passed to BMI160 as * the target on all axis is set internally to 0. This is used just to * trigger a gyro calibration. */ if (sensor_attr_set(bmi160, SENSOR_CHAN_GYRO_XYZ, SENSOR_ATTR_CALIB_TARGET, NULL) < 0) { return -EIO; } #endif return 0; }
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 }