blob: 276bfe268a8257feb4e596f5b9910d95a9b5c298 [file] [log] [blame]
Changing the Default Configuration for a Sensor
===============================================
This tutorial shows you how to change default configuration values for
an off-board sensor. It continues with the example in the :doc:`Enabling an
Off-Board Sensor in an Existing Application tutorial <sensor_nrf52_bno055>`
**Note:** You can also follow most of the instructions in this
tutorial to change the default configuration for an onboard sensor. The
difference is that the BSP, instead of the sensor creator package,
creates and configures the onboard sensor devices in the ``hal_bsp.c``
file. You should check the BSP to determine whether the default
configuration for a sensor meets your application requirements.
.. contents::
:local:
:depth: 2
Prerequisites
~~~~~~~~~~~~~
Complete the tasks described in the :doc:`Enabling an Off-Board Sensor in an
Existing Application tutorial <sensor_nrf52_bno055>`
Overview on How to Initialize the Configuration Values for a Sensor
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The sensor creator package, ``hw/sensor/creator``, creates, for each
enabled sensor, an os device in the kernel for the sensor and
initializes the sensor with its default configuration when the package
is initialized. The steps to configure a sensor device are:
1. Open the os device for the sensor.
2. Initialize the sensor driver configuration data structure with
default values.
3. Call the ``<sensorname>_config()`` function that the sensor device
driver package exports.
4. Close the os device for the sensor.
For the BNO055 sensor device, the creator package calls the local
``config_bno055_sensor()`` function to configure the sensor. A code
excerpt for this function is shown below:
.. code-block:: c
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_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;
}
Changing the Default Configuration
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
To change the default configuration, you can directly edit the fields in
the ``config_bno055_sensor()`` function in the
``hw/sensor/creator/sensor_creator.c`` file or add code to your
application to reconfigure the sensor during application initialization.
This tutorial shows you how to add the code to the
``apps/sensors_test/src/main.c`` file to configure the sensor without
the accelerometer sensor type. When you reconfigure a sensor in the
application, you must initialize all the fields in the sensor
configuration data structure even if you are not changing the default
values.
Step 1: Adding the Sensor Device Driver Header File
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Add the bno055 device driver header file:
.. code-block:: c
#include <bno055/bno055.h>
Step 2: Adding a New Configuration Function
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Add the ``sensors_test_config_bno055()`` function and copy the code from
the ``config_bno055_sensor()`` function in the
``hw/sensor/creator/sensor_creator.c`` file to the body of the
``sensors_test_config_bno055()`` function. The content of the
``sensors_test_config_bno055()`` function should look like the example
below:
.. code-block:: c
static int
sensors_test_config_bno055(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;
}
Step 3: Changing the Default Configuration Settings
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Delete the ``SENSOR_TYPE_ACCELEROMETER`` type from the ``bcfg.bc_mask``
initialization setting values:
.. code-block:: c
:emphasize-lines: 8
static int
sensors_test_config_bno055(void)
{
int rc
...
/* Delete the SENSOR_TYPE_ACCELEROMETER from the mask */
bcfg.bc_mask = 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;
}
.. end
Step 4: Calling the Configuration Function From main()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Add the ``int rc`` declaration and the call to the
``sensors_test_config_bno055()`` function in ``main()``:
.. code-block:: c
int
main(int argc, char **argv)
{
/* Add rc for the return value from sensors_test_config_bno055() */
int rc;
....
/* Add call to sensors_test_config_bno055() and abort on error */
rc = sensors_test_config_bno055();
assert(rc == 0);
/* log reboot */
reboot_start(hal_reset_cause());
/*
* As the last thing, process events from default event queue.
*/
while (1) {
os_eventq_run(os_eventq_dflt_get());
}
return (0);
}
Step 5: Building a New Application Image
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Run the ``newt build nrf52_bno055_test`` and the
``newt create-image nrf52_bno055_test 2.0.0`` commands to rebuild and
create a new application image.
Step 6: Loading the New Image and Rebooting the Device
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Run the ``newt load nrf52_bno055_test`` command and power the device OFF
and On.
Step 7: Verifing the Sensor is Configured with the New Values
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Start a terminal emulator, and run the ``sensor list`` command to verify
the accelerometer (0x1) is not configured. The ``configured type``
listed for the sensor should not have the value ``0x1``.
.. code-block:: c
:emphasize-lines: 2
045930 compat> sensor list
046482 sensor dev = bno055_0, configured type = 0x2 0x4 0x200 0x1000 0x2000 0x4000
046484 compat>
Step 8: Verifying that the Accelerometer Data Samples Cannot be Read
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Run the ``sensor read`` command to read data samples from the
accelerometer to verify that the sensor cannot be read:
.. code-block:: console
046484 compat> sensor read bno055_0 0x1 -n 5
092387 Cannot read sensor bno055_0