| 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 |