blob: 97bec600e3d8090f2927e74d559ced02469aa316 [file] [log] [blame]
Enabling Newt Manager in Your Application
-----------------------------------------
In order for your application to communicate with the newtmgr tool and
process Newt Manager commands, you must enable Newt Manager device
management and the support to process Newt Manager commands in your
application. This tutorial explains how to add the support to your
application.
This tutorial assumes that you have read the :doc:`Device Management with
Newt Manager <../../../os/modules/devmgmt/newtmgr>` guide and are familiar
with the ``newtmgr`` and ``oicmgr`` frameworks and all the options that
are available to customize your application.
This tutorial shows you how to configure your application to:
- Use the newtmgr framework.
- Use serial transport to communicate with the newtmgr tool.
- Support all Newt Manager commands.
See :doc:`Other Configuration Options <#other-configuration-options>` on
how to customize your application.
.. contents::
:local:
:depth: 2
Prerequisites
~~~~~~~~~~~~~
Ensure that you have met the following prerequisites before continuing
with this tutorial:
- Have Internet connectivity to fetch remote Mynewt components.
- Have a cable to establish a serial USB connection between the board
and the laptop.
- Install the newt tool and toolchains (See :doc:`Basic
Setup <../../get_started/index>`).
- Install the :doc:`newtmgr tool <../../newtmgr/docs/install/index>`.
Use an Existing Project
~~~~~~~~~~~~~~~~~~~~~~~
We assume that you have worked through at least some of the other
tutorials and have an existing project. In this example, we modify the
``btshell`` app to enable Newt Manager support. We call our target
``myble``. You can create the target using any name you choose.
Modify Package Dependencies and Configurations
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Add the following packages to the ``pkg.deps`` parameter in your target
or application ``pkg.yml`` file:
.. code-block:: console
pkg.deps:
- mgmt/newtmgr
- mgmt/newtmgr/transport/nmgr_shell
- mgmt/imgmgr
- sys/log/full
- sys/stats/full
- sys/config
- test/crash_test
- test/runtest
Each package provides the following Newt Manager functionality:
- ``mgmt/newtmgr``: Supports the newtmgr framework and the Newt Manager
``echo``, ``taskstat`` ``mpstat``, ``datetime``, and ``reset``
commands.
- ``mgmt/newtmgr/transport/nmgr_shell``: Supports serial transport.
- ``mgmt/imgmgr``: Supports the ``newtmgr image`` command
- ``sys/log/full`` : Supports the ``newtmgr log`` command.
- ``sys/stats/full``: Supports the ``newtmgr stat`` command.
- ``sys/config``: Supports the ``newtmgr config`` command.
- ``test/crash_test``: Supports the ``newtmgr crash`` command.
- ``test/runtest``: Supports the ``newt run`` command.
Add the following configuration setting values to the ``syscfg.vals``
parameter in the target or application ``syscfg.yml`` file:
.. code-block:: console
syscfg.vals:
LOG_NEWTMGR: 1
STATS_NEWTMGR: 1
CONFIG_NEWTMGR: 1
CRASH_TEST_NEWTMGR: 1
RUNTEST_NEWTMGR: 1
SHELL_TASK: 1
SHELL_NEWTMGR: 1
The first five configuration settings enable support for the Newt
Manager ``log``, ``stat``, ``config``, ``crash``, and ``run`` commands.
The ``SHELL_TASK`` setting enables the shell for serial transport. The
``SHELL_NEWTMGR`` setting enables newtmgr support in the shell.
Note that you may need to override additional configuration settings
that are specific to each package to customize the package
functionality.
Modify the Source
~~~~~~~~~~~~~~~~~
By default, the ``mgmt`` package uses the Mynewt default event queue to
receive request events from the newtmgr tool. These events are processed
in the context of the application main task.
You can specify a different event queue for the package to use. If you
choose to use a dedicated event queue, you must create a task to process
events from this event queue. The ``mgmt`` package executes and handles
newtmgr request events in the context of this task. The ``mgmt`` package
exports the ``mgmt_evq_set()`` function that allows you to specify an
event queue.
This example uses the Mynewt default event queue and you do not need to
modify your application source.
If you choose to use a different event queue, see :doc:`Events and Event
Queues <../os_fundamentals/event_queue>` for details on how to initialize an event
queue and create a task to process the events. You will also need to
modify your ``main.c`` to add the call to the ``mgmt_evq_set()``
function as follows:
Add the ``mgmt/mgmt.h`` header file:
.. code-block:: c
#include <mgmt/mgmt.h>
Add the call to specify the event queue. In the ``main()`` function,
scroll down to the ``while (1)`` loop and add the following statement
above the loop:
.. code-block:: c
mgmt_evq_set(&my_eventq)
where ``my_eventq`` is an event queue that you have initialized.
Build the Targets
~~~~~~~~~~~~~~~~~
Build the two targets as follows:
.. code-block:: console
$ newt build nrf52_boot
<snip>
App successfully built: ./bin/nrf52_boot/apps/boot/boot.elf
$ newt build myble
Compiling hci_common.c
Compiling util.c
Archiving nimble.a
Compiling os.c
<snip>
Create the Application Image
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Generate an application image for the ``myble`` target. You can use any
version number you choose.
.. code-block:: console
$ newt create-image myble 1.0.0
App image successfully generated: ./bin/makerbeacon/apps/btshell/btshell.img
Build manifest: ./bin/makerbeacon/apps/btshell/manifest.json
Load the Image
~~~~~~~~~~~~~~
Ensure the USB connector is in place and the power LED on the board is
lit. Turn the power switch on your board off, then back on to reset the
board after loading the image.
.. code-block:: console
$ newt load nrf52_boot
$ newt load myble
Set Up a Connection Profile
~~~~~~~~~~~~~~~~~~~~~~~~~~~
The newtmgr tool requires a connection profile in order to connect to
your board. If you have not done so, follow the
:doc:`instructions <../../newtmgr/command_list/newtmgr_conn>` for
setting up your connection profile.
Communicate with Your Application
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Once you have a connection profile set up, you can connect to your
device with ``newtmgr -c myconn <command>`` to run commands in your
application.
Issue the ``echo`` command to ensure that your application is
communicating with the newtmgr tool:
.. code-block:: console
$ newtmgr -c myconn echo hello
hello
Test your application to ensure that it can process a Newt Manager
command that is supported by a different package. Issue the ``stat``
command to see the BLE stats.
.. code-block:: console
stat group: ble_att
0 error_rsp_rx
0 error_rsp_tx
0 exec_write_req_rx
0 exec_write_req_tx
0 exec_write_rsp_rx
0 exec_write_rsp_tx
0 find_info_req_rx
0 find_info_req_tx
0 find_info_rsp_rx
0 find_info_rsp_tx
0 find_type_value_req_rx
...
0 read_type_req_tx
0 read_type_rsp_rx
0 read_type_rsp_tx
0 write_cmd_rx
0 write_cmd_tx
0 write_req_rx
0 write_req_tx
0 write_rsp_rx
0 write_rsp_tx
Your application is now able to communicate with the newtmgr tool.
Other Configuration Options
~~~~~~~~~~~~~~~~~~~~~~~~~~~
This section explains how to customize your application to use other
Newt Manager protocol options.
Newtmgr Framework Transport Protocol Options
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The newtmgr framework currently supports BLE and serial transport
protocols. To configure the transport protocols that are supported,
modify the ``pkg.yml`` and ``syscfg.yml`` files as follows:
- Add the ``mgmt/newtmgr/transport/ble`` package to the ``pkg.deps``
parameter to enable BLE transport.
- Add the ``mgmt/newtmgr/transport/nmgr_shell`` package to the
``pkg.deps`` parameter, and add ``SHELL_TASK: 1`` and
``SHELL_NEWTMGR`` to the ``syscfg.vals`` parameter to enable serial
transport when your application also uses the
:doc:`Shell <../../../os/modules/shell/shell>`.
- Add the ``mgmt/newtmgr/transport/nmgr_uart`` package to the
``pkg.deps`` parameter to enable serial transport over a UART port.
You can use this package instead of the ``nmgr_shell`` package when
your application does not use the
:doc:`Shell <../../../os/modules/shell/shell>` or you want to use a dedicated
UART port to communicate with newtmgr. You can change the
``NMGR_UART`` and ``NMGR_URART_SPEED`` sysconfig values to specify a
different port.
Oicmgr Framework Options
^^^^^^^^^^^^^^^^^^^^^^^^
To use the oicmgr framework instead of the newtmgr framework, modify the
``pkg.yml`` and ``syscfg.yml`` files as follows:
- Add the ``mgmt/oicmgr`` package (instead of the ``mgmt/newtmgr`` and
``mgmt/newtmgr/transport`` packages as described previously) to the
``pkg.deps`` parameter.
- Add ``OC_SERVER: 1`` to the ``syscfg.vals`` parameter.
Oicmgr supports the IP, serial, and BLE transport protocols. To
configure the transport protocols that are supported, set the
configuration setting values in the ``syscfg.vals`` parameter as
follows:
- Add ``OC_TRANSPORT_IP: 1`` to enable IP transport.
- Add ``OC_TRANSPORT_GATT: 1`` to enable BLE transport.
- Add ``OC_TRANSPORT_SERIAL: 1``, ``SHELL_TASK: 1``,
``SHELL_NEWTMGR:1`` to enable serial transport.
Customize the Newt Manager Commands that Your Application Supports
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
We recommend that you only enable support for the Newt Manager commands
that your application uses to reduce your application code size. To
configure the commands that are supported, set the configuration setting
values in the ``syscfg.vals`` parameter as follows:
- Add ``LOG_NEWTMGR: 1`` to enable support for the ``newtmgr log``
command.
- Add ``STATS_NEWTMGR: 1`` to enable support for the ``newtmgr stat``
command.
- Add ``CONFIG_NEWTMGR: 1`` to enable support for the
``newtmgr config`` command.
- Add ``CRASH_TEST_NEWTMGR: 1`` to enable support for the
``newtmgr crash`` command.
- Add ``RUNTEST_NEWTMGR: 1`` to enable support for the
``newtmgr crash`` command.
Notes:
- When you enable Newt Manager support, using either the newtmgr or
oicmgr framework, your application automatically supports the Newt
Manager ``echo``, ``taskstat``, ``mpstat``, ``datetime``, and
``reset`` commands. These commands cannot be configured individually.
- The ``mgmt/imgmgr`` package does not provide a configuration setting
to enable or disable support for the ``newtmgr image`` command. Do
not specify the package in the ``pkg.deps`` parameter if your device
has limited flash memory and cannot support Over-The-Air (OTA)
firmware upgrades.