Enabling OIC Sensor Data Monitoring in the sensors_test Application
--------------------------------------------------------------------

This tutorial shows you how to enable sensor data monitoring via the OIC
protocol over BLE transport in the sensors\_test application. It extends
the example application in the :doc:`Enabling an Off-Board Sensor in an
Existing Application Tutorial <sensor_nrf52_bno055>` and assumes that you
have worked through that tutorial.

Like the other off-board sensor tutorials, this tutorial uses an
nRF52-DK board connected to an off-board BNO055 sensor device.

This tutorial shows you how to:

-  Create and build the target to enable sensor OIC support in the
   sensors\_test application.
-  Use the Mynewt Smart Device Controller Android or iOS app to view the
   sensor data from the device.

.. contents::
  :local:
  :depth: 2
  
Prerequisites
~~~~~~~~~~~~~

Read the :doc:`Overview of OIC Support in the Sensor Framework
<sensor_oic_overview>`

Step 1: Creating and Building the sensors\_test Application Image
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

In this step of the tutorial, we set the following syscfg settings to
create a target for the sensors\_test application.

-  ``BNO055_OFB`` and ``I2C_0``: Set to 1 to enable the BNO055 off-board
   sensor device and the I2C interface 0 in the nRF52 BSP.
-  ``BLE_MAX_CONNECTIONS``: Set the number of BLE connections to 4.
-  ``MSYS_1_BLOCK_COUNT``: Set the number of entries for the mbuf pool
   to 52.
-  ``MSYS_1_BLOCK_SIZE``: Set the size of mbuf entry to 100.
-  ``OC_APP_RESOURCES``: Set the number of server resources to 12.

**Note:** The ``SENSOR_OIC``, ``OC_SERVER``, ``BLE_ROLE_PERIPHERAL`` and
``BLE_ROLE_BROADCASTER`` syscfg settings must be enabled to add OIC
sensor monitoring over BLE transport support to an application. You do
not need to set these settings in the target because the
``apps/sensors_test`` package enables the ``SENSORS_OIC`` and
``OC_SERVER`` syscfg settings by default, and the ``net/nimble`` package
enables the ``BLE_ROLE_PERIPHERAL`` and ``BLE_ROLE_BROADCASTER``
settings by default.

1. Run the ``newt target create`` command to create the target. We name
the target ``nrf52_bno055_oic_test``.

.. code-block:: console


    $ newt target create nrf52_bno055_oic_test
    Target targets/nrf52_bno055_oic_test successfully created
    $

2. Run the ``newt target set`` command to set the app, bsp, and
build\_profile variables for the target:

.. code-block:: console


    $ newt target set nrf52_bno055_oic_test app=@apache-mynewt-core/apps/sensors_test bsp=@apache-mynewt-core/hw/bsp/nrf52dk build_profile=debug 
    Target targets/nrf52_bno055_oic_test successfully set target.app to @apache-mynewt-core/apps/sensors_test
    Target targets/nrf52_bno055_oic_test successfully set target.bsp to @apache-mynewt-core/hw/bsp/nrf52dk
    Target targets/nrf52_bno055_oic_test successfully set target.build_profile to debug
    $

3. Run the ``newt target set`` command to set ``I2C_0=1``,
``BNO055_OFB=1``, ``BLE_MAX_CONNECTIONS=4``, ``MSYS_1_BLOCK_COUNT=52``,
``MSYS_1_BLOCK_SIZE=100``, and ``OC_APP_RESOURCES=11``.

**Note:** If you want to disable the ``sensor`` and ``bno055`` shell
commands, also set ``SENSOR_CLI=0`` and ``BNO055_CLI=0``.

.. code-block:: console


    $ newt target set nrf52_bno055_oic_test syscfg=BNO055_OFB=1:I2C_0=1:BLE_MAX_CONNECTIONS=4:MSYS_1_BLOCK_COUNT=52:MSYS_1_BLOCK_SIZE=100:OC_APP_RESOURCES=11
    Target targets/nrf52_bno055_oic_test successfully set target.syscfg to BNO055_OFB=1:I2C_0=1:BLE_MAX_CONNECTIONS=4:MSYS_1_BLOCK_COUNT=52:MSYS_1_BLOCK_SIZE=100:OC_APP_RESOURCES=11
    $

4. Run the ``newt build nrf52_bno055_oic_test`` and
``newt create-image nrf52_bno055_oic_test 1.0.0`` commands to build and
create the application image.

Step 2: Connecting the Sensor and Loading the Images to the Board
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


Perform the following steps to reboot the board with the new images:

1. Connect the BNO055 sensor to the nRF52-DK board. See the :doc:`Enabling
   an Off-Board Sensor in an Existing Application Tutorial
   <sensor_nrf52_bno055>` for instructions.

   **Note**: You do not need the serial connection from your computer to
   the nRF52-DK board for this tutorial because we are not using the
   shell to view the sensor data.

2. Run the ``newt load nrf52_boot`` command to load the bootloader.
3. Run the ``newt load nrf52_bno055_oic_test`` command to load the
   application image.
4. Power the device OFF and ON to reboot.

Step 3: Viewing Sensor Data from the Mynewt Smart Device Controller
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


Start the Mynewt Smart Device Controller app on your iOS or Android
device to view the sensor data. If you have not installed the Mynewt
Smart Device Controller follow the instructions in the :doc:`Sensor Tutorials
Overview <sensors>` to install the app, then continue with this step of
the tutorial.

The Mynewt Smart Device Controller scans for the devices when it starts
up and displays the sensors it can view. The following is an example
from the Android App:

.. image:: ../pics/smart_controller_main.png
   :align: center

1. Select ``Accelerometer`` to see the sensor data samples:

.. image:: ../pics/smart_controller_accelerometer.png
   :align: center

2. Move your BNO055 sensor device around to see the values for the
   coordinates change.
