blob: d93004977615efcd6764a0840cae5b512f7f5b7a [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Developing an Application for an Onboard Sensor &mdash; Apache Mynewt latest documentation</title>
<link rel="shortcut icon" href="../../_static/mynewt-logo-only-newt32x32.png"/>
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../_static/css/sphinx_theme.css" type="text/css" />
<link rel="stylesheet" href="../../_static/css/bootstrap-3.0.3.min.css" type="text/css" />
<link rel="stylesheet" href="../../_static/css/v2.css" type="text/css" />
<link rel="stylesheet" href="../../_static/css/custom.css" type="text/css" />
<link rel="stylesheet" href="../../_static/css/restructuredtext.css" type="text/css" />
<link rel="stylesheet" href="../../_static/css/overrides.css" type="text/css" />
<link rel="index" title="Index"
href="../../genindex.html"/>
<link rel="search" title="Search" href="../../search.html"/>
<link rel="top" title="Apache Mynewt latest documentation" href="../../index.html"/>
<link rel="up" title="Sensor Tutorials Overview" href="sensors_framework.html"/>
<link rel="next" title="Enabling OIC Sensor Data Monitoring" href="sensor_oic_overview.html"/>
<link rel="prev" title="Changing the Default Configuration for a Sensor" href="sensor_offboard_config.html"/>
<script src="../../_static/js/modernizr.min.js"></script>
<script>
(function(i, s, o, g, r, a, m) {
i["GoogleAnalyticsObject"] = r;
(i[r] =
i[r] ||
function() {
(i[r].q = i[r].q || []).push(arguments);
}),
(i[r].l = 1 * new Date());
(a = s.createElement(o)), (m = s.getElementsByTagName(o)[0]);
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m);
})(window, document, "script", "//www.google-analytics.com/analytics.js", "ga");
ga("create", "UA-72162311-1", "auto");
ga("send", "pageview");
</script>
</head>
<body class="not-front page-documentation" role="document" >
<div id="wrapper">
<div class="container">
<div id="banner" class="row v2-main-banner">
<a class="logo-cell" href="/">
<img class="logo" src="../../_static/img/logo.png">
</a>
<div class="tagline-cell">
<h4 class="tagline">An OS to build, deploy and securely manage billions of devices</h4>
</div>
<div class="news-cell">
<div class="well">
<h4>Latest News:</h4> <a href="/download">Apache Mynewt 1.12.0, Apache NimBLE 1.7.0 </a> released April 4, 2024)
</div>
</div>
</div>
</div>
<header>
<nav id="navbar" class="navbar navbar-inverse" role="navigation">
<div class="container">
<!-- Collapsed navigation -->
<div class="navbar-header">
<!-- Expander button -->
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
<!-- Expanded navigation -->
<div class="navbar-collapse collapse">
<!-- Main navigation -->
<ul class="nav navbar-nav navbar-right">
<li>
<a href="/"><i class="fa fa-home" style="font-size: larger;"></i></a>
</li>
<li class="important">
<a href="/quick-start/">Quick Start</a>
</li>
<li>
<a href="/about/">About</a>
</li>
<li>
<a href="/talks/">Talks</a>
</li>
<li class="active">
<a href="/documentation/">Documentation</a>
</li>
<li>
<a href="/download/">Download</a>
</li>
<li>
<a href="/community/">Community</a>
</li>
<li>
<a href="/events/">Events</a>
</li>
</ul>
<!-- Search, Navigation and Repo links -->
<ul class="nav navbar-nav navbar-right">
</ul>
</div>
</div>
</nav>
</header>
<!-- STARTS MAIN CONTENT -->
<div id="main-content">
<div id="breadcrumb">
<div class="container">
<a href="/documentation/">Docs</a> /
<a href="../tutorials.html">Tutorials</a> /
<a href="sensors.html">Sensors</a> /
<a href="sensors_framework.html">Sensor Tutorials Overview</a> /
Developing an Application for an Onboard Sensor
<div class="sourcelink">
<a href="https://github.com/apache/mynewt-documentation/edit/master/docs/tutorials/sensors/sensor_thingy_lis2dh12_onb.rst" class="icon icon-github"
rel="nofollow"> Edit on GitHub</a>
</div>
</div>
</div>
<!-- STARTS CONTAINER -->
<div class="container">
<!-- STARTS .content -->
<div id="content" class="row">
<!-- STARTS .container-sidebar -->
<div class="container-sidebar col-xs-12 col-sm-3">
<div id="docSidebar" class="sticky-container">
<div role="search" class="sphinx-search">
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search documentation" class="search-documentation" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
<!-- Note: only works when deployed -->
<select class="form-control" onchange="if (this.value) window.location.href=this.value">
<option value="/latest" selected>
Version: latest
</option>
<option value="/v1_12_0" >
Version: 1.12.0
</option>
<option value="/v1_11_0" >
Version: 1.11.0
</option>
<option value="/v1_10_0" >
Version: 1.10.0
</option>
<option value="/v1_9_0" >
Version: 1.9.0
</option>
<option value="/v1_8_0" >
Version: 1.8.0
</option>
<option value="/v1_7_0" >
Version: 1.7.0
</option>
<option value="/v1_6_0" selected="selected" >
Version: 1.6.0
</option>
<option value="/v1_5_0" >
Version: 1.5.0
</option>
<option value="/v1_4_0" >
Version: 1.4.0
</option>
<option value="/v1_3_0/os/introduction" >
Version: 1.3.0
</option>
<option value="/v1_2_0/os/introduction" >
Version: 1.2.0
</option>
<option value="/v1_1_0/os/introduction" >
Version: 1.1.0
</option>
<option value="/v1_0_0/os/introduction" >
Version: 1.0.0
</option>
<option value="/v0_9_0/os/introduction" >
Version: 0.9.0
</option>
</select>
<div class="region region-sidebar">
<div class="docs-menu">
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../../index.html">Introduction</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../get_started/index.html">Setup &amp; Get Started</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../concepts.html">Concepts</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../tutorials.html">Tutorials</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="../blinky/blinky.html">Project Blinky</a></li>
<li class="toctree-l2"><a class="reference internal" href="../repo/add_repos.html">Working with repositories</a></li>
<li class="toctree-l2"><a class="reference internal" href="../slinky/project-slinky.html">Project Slinky for Remote Comms</a></li>
<li class="toctree-l2"><a class="reference internal" href="../ble/ble.html">Bluetooth Low Energy</a></li>
<li class="toctree-l2"><a class="reference internal" href="../lora/lorawanapp.html">LoRa</a></li>
<li class="toctree-l2"><a class="reference internal" href="../os_fundamentals/os_fundamentals.html">OS Fundamentals</a></li>
<li class="toctree-l2"><a class="reference internal" href="../devmgmt/devmgmt.html">Remote Device Management</a></li>
<li class="toctree-l2 current"><a class="reference internal" href="sensors.html">Sensors</a><ul class="current">
<li class="toctree-l3 current"><a class="reference internal" href="sensors_framework.html">Sensor Framework</a><ul class="current">
<li class="toctree-l4"><a class="reference internal" href="sensor_nrf52_bno055.html">Enable an Off-Board Sensor in an Existing Application</a></li>
<li class="toctree-l4"><a class="reference internal" href="sensor_offboard_config.html">Change the Default Configuration For a Sensor</a></li>
<li class="toctree-l4 current"><a class="current reference internal" href="#">Develope an Application for an Onboard Sensor</a></li>
<li class="toctree-l4"><a class="reference internal" href="sensor_oic_overview.html">Enable OIC Sensor Data Monitoring</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="air_quality.html">Air Quality Sensor Project</a></li>
<li class="toctree-l3"><a class="reference internal" href="nrf52_adc.html">Add an Analog Sensor</a></li>
<li class="toctree-l3"><a class="reference internal" href="sensor_nrf52_drv2605.html">Connect a DRV2605 actuator device</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../tooling/tooling.html">Tooling</a></li>
<li class="toctree-l2"><a class="reference internal" href="../other/other.html">Other</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../external_links.html">Third-party Resources</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../os/os_user_guide.html">OS User Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../network/index.html">BLE User Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../newt/index.html">Newt Tool Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../newtmgr/index.html">Newt Manager Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../mynewt_faq/index.html">Mynewt FAQ</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../misc/index.html">Appendix</a></li>
</ul>
</div>
</div>
</div>
<!-- ENDS STICKY CONTAINER -->
</div>
<!-- ENDS .container-sidebar -->
<div class="col-xs-12 col-sm-9">
<div class="alert alert-warning">
<p>
Version 1.6.0 is not the most recent version of the
Apache Mynewt documentation. Click <a href="/latest">here</a> to
read the latest version.
</p>
</div>
<div class="">
<div class="rst-content">
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="developing-an-application-for-an-onboard-sensor">
<h1>Developing an Application for an Onboard Sensor<a class="headerlink" href="#developing-an-application-for-an-onboard-sensor" title="Permalink to this headline">ΒΆ</a></h1>
<p>This tutorial shows you how to develop a simple application for an
onboard sensor. The Mynewt sensor framework enables you to easily and
quickly develop Mynewt sensor applications. We assume that you have
completed the <a class="reference internal" href="sensor_nrf52_bno055.html"><span class="doc">Enabling an Off-Board Sensor in an Existing Application
Tutorial</span></a> and are familiar with the sensor
framework and sensor shell command.</p>
<p>This tutorial shows you how to:</p>
<ul class="simple">
<li><p>Develop an application for the Nordic Thingy LIS2DH12 accelerometer
onboard sensor with the sensor framework <code class="docutils literal notranslate"><span class="pre">sensor</span></code> shell command
enabled to view sensor data.</p></li>
<li><p>Extend the application to use the sensor framework API to read the
sensor data and output the data to the Mynewt console.</p></li>
</ul>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><p><a class="reference internal" href="#prerequisites" id="id1">Prerequisites</a></p></li>
<li><p><a class="reference internal" href="#developing-a-sensor-enabled-application-with-shell-support" id="id2">Developing a Sensor Enabled Application with Shell Support</a></p>
<ul>
<li><p><a class="reference internal" href="#step-1-creating-a-new-app-package" id="id3">Step 1: Creating a New App Package</a></p></li>
<li><p><a class="reference internal" href="#step-2-adding-the-package-dependencies" id="id4">Step 2: Adding the Package Dependencies</a></p></li>
<li><p><a class="reference internal" href="#step-3-using-the-skeleton-main-c-file" id="id5">Step 3: Using the Skeleton main.c File</a></p></li>
<li><p><a class="reference internal" href="#step-4-creating-the-target-for-the-my-sensor-app-application" id="id6">Step 4: Creating the Target for the my_sensor_app Application</a></p></li>
<li><p><a class="reference internal" href="#step-5-creating-and-building-the-bootloader-target" id="id7">Step 5: Creating and Building the Bootloader Target</a></p></li>
<li><p><a class="reference internal" href="#step-6-connecting-the-thingy-to-your-computer" id="id8">Step 6: Connecting the Thingy to your Computer</a></p></li>
<li><p><a class="reference internal" href="#step-7-loading-the-image-and-connecting-to-the-console-via-rtt" id="id9">Step 7: Loading the Image and Connecting to the Console via RTT</a></p></li>
<li><p><a class="reference internal" href="#step-8-viewing-the-list-of-sensors-and-sensor-data" id="id10">Step 8: Viewing the list of Sensors and Sensor Data</a></p></li>
<li><p><a class="reference internal" href="#extending-the-application-to-use-the-sensor-api-to-read-sensor-data" id="id11">Extending the Application to Use the Sensor API to Read Sensor Data</a></p></li>
<li><p><a class="reference internal" href="#step-1-modifying-main-c-to-add-a-sensor-listener" id="id12">Step 1: Modifying main.c to Add a Sensor Listener</a></p></li>
<li><p><a class="reference internal" href="#step-2-rebuilding-the-application-and-connecting-to-console" id="id13">Step 2: Rebuilding the Application and Connecting to Console</a></p></li>
<li><p><a class="reference internal" href="#step-3-modifying-main-c-to-use-sensor-read-instead-of-a-listener" id="id14">Step 3: Modifying main.c to Use sensor_read() Instead of a Listener</a></p></li>
<li><p><a class="reference internal" href="#step-4-rebuilding-the-application-and-connecting-to-console" id="id15">Step 4: Rebuilding the Application and Connecting to Console</a></p></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="prerequisites">
<h2><a class="toc-backref" href="#id1">Prerequisites</a><a class="headerlink" href="#prerequisites" title="Permalink to this headline">ΒΆ</a></h2>
<ul class="simple">
<li><p>Meet the prerequisites listed in the <a class="reference internal" href="sensors_framework.html"><span class="doc">Sensor Tutorials
Overview</span></a></p></li>
<li><p>Have a Nordic Thingy.</p></li>
<li><p><a class="reference external" href="https://www.segger.com/jlink-debug-probes.html">Segger J-Link Debug
Probe</a>.</p></li>
<li><p><a class="reference external" href="https://www.segger.com/jlink-adapters.html#CM_9pin">J-Link 9 pin Cortex-M
Adapter</a> that
allows JTAG, SWD and SWO connections between J-Link and Cortex M
based target hardware systems.</p></li>
<li><p>Install the <a class="reference external" href="https://www.segger.com/jlink-software.html">Segger JLINK Software and documentation
pack</a>.</p></li>
<li><p>Complete the <a class="reference internal" href="sensor_nrf52_bno055.html"><span class="doc">Enabling an Off-Board Sensor in an Existing Application
Tutorial</span></a></p></li>
</ul>
</div>
<div class="section" id="developing-a-sensor-enabled-application-with-shell-support">
<h2><a class="toc-backref" href="#id2">Developing a Sensor Enabled Application with Shell Support</a><a class="headerlink" href="#developing-a-sensor-enabled-application-with-shell-support" title="Permalink to this headline">ΒΆ</a></h2>
<p>We first develop a simple application with the LIS2DH12 onboard sensor
on the Nordic Thingy and the <code class="docutils literal notranslate"><span class="pre">sensor</span></code> shell command enabled.</p>
<div class="section" id="step-1-creating-a-new-app-package">
<h3><a class="toc-backref" href="#id3">Step 1: Creating a New App Package</a><a class="headerlink" href="#step-1-creating-a-new-app-package" title="Permalink to this headline">ΒΆ</a></h3>
<p>We name the new app package <code class="docutils literal notranslate"><span class="pre">my_sensor_app</span></code>. From your project base
directory, run the <code class="docutils literal notranslate"><span class="pre">newt</span> <span class="pre">pkg</span> <span class="pre">new</span></code> command to create a new app package.
This tutorial uses ~/dev/myproj for the project.</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span><span class="nb">cd</span><span class="w"> </span>~/dev/myproj
<span class="gp">$ </span>newt<span class="w"> </span>pkg<span class="w"> </span>new<span class="w"> </span>-t<span class="w"> </span>app<span class="w"> </span>apps/my_sensor_app
<span class="go">Download package template for package type app.</span>
<span class="go">Package successfuly installed into ~/dev/myproj/apps/my_sensor_app</span>
</pre></div>
</div>
<p>The newt tool creates a skeleton <code class="docutils literal notranslate"><span class="pre">my_sensor_app</span></code> package directory in
the <code class="docutils literal notranslate"><span class="pre">~/dev/myproj/apps/</span></code> directory. Go to the <code class="docutils literal notranslate"><span class="pre">my_sensor_app</span></code>
directory to update the package <code class="docutils literal notranslate"><span class="pre">pkg.yml</span></code> and source files.</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span><span class="nb">cd</span><span class="w"> </span>apps/my_sensor_app
</pre></div>
</div>
</div>
<div class="section" id="step-2-adding-the-package-dependencies">
<h3><a class="toc-backref" href="#id4">Step 2: Adding the Package Dependencies</a><a class="headerlink" href="#step-2-adding-the-package-dependencies" title="Permalink to this headline">ΒΆ</a></h3>
<p>The my_sensor_app package requires the sensor framework,
<code class="docutils literal notranslate"><span class="pre">hw/sensor</span></code>, package as a package dependency. Note that the BSP
creates the sensor devices for the onboard sensors, so the
<code class="docutils literal notranslate"><span class="pre">hw/sensor/creator</span></code> package that creates off-board sensor is not
needed.</p>
<p>Add the highlighted line to the <code class="docutils literal notranslate"><span class="pre">pkg.yml</span></code> file to add the
<code class="docutils literal notranslate"><span class="pre">hw/sensor</span></code> package as package dependency:</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go"> pkg.deps:</span>
<span class="go"> - &quot;@apache-mynewt-core/kernel/os&quot;</span>
<span class="go"> - &quot;@apache-mynewt-core/sys/console/full&quot;</span>
<span class="go"> - &quot;@apache-mynewt-core/sys/log/full&quot;</span>
<span class="go"> - &quot;@apache-mynewt-core/sys/stats/full&quot;</span>
<span class="hll"><span class="go"> - &quot;@apache-mynewt-core/hw/sensor&quot;</span>
</span></pre></div>
</div>
</div>
<div class="section" id="step-3-using-the-skeleton-main-c-file">
<h3><a class="toc-backref" href="#id5">Step 3: Using the Skeleton main.c File</a><a class="headerlink" href="#step-3-using-the-skeleton-main-c-file" title="Permalink to this headline">ΒΆ</a></h3>
<p>The newt tool creates a skeleton main.c file in the
<code class="docutils literal notranslate"><span class="pre">my_sensor_app/src</span></code> directory. The skeleton <code class="docutils literal notranslate"><span class="pre">main()</span></code> code shown is
all you need to build an application that only uses the <code class="docutils literal notranslate"><span class="pre">sensor</span></code> shell
command to read sensor data. You do not need to make any changes to the
file. The sensor framework implements the <code class="docutils literal notranslate"><span class="pre">sensor</span></code> shell command and
the shell package processes shell command events from the OS default
event queue.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span>
<span class="nf">main</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">argc</span><span class="p">,</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">**</span><span class="n">argv</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="cm">/* Perform some extra setup if we&#39;re running in the simulator. */</span>
<span class="cp">#ifdef ARCH_sim</span>
<span class="w"> </span><span class="n">mcu_sim_parse_args</span><span class="p">(</span><span class="n">argc</span><span class="p">,</span><span class="w"> </span><span class="n">argv</span><span class="p">);</span>
<span class="cp">#endif</span>
<span class="w"> </span><span class="cm">/* Initialize all packages. */</span>
<span class="w"> </span><span class="n">sysinit</span><span class="p">();</span>
<span class="w"> </span><span class="cm">/* As the last thing, process events from default event queue. */</span>
<span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">os_eventq_run</span><span class="p">(</span><span class="n">os_eventq_dflt_get</span><span class="p">());</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
<div class="section" id="step-4-creating-the-target-for-the-my-sensor-app-application">
<h3><a class="toc-backref" href="#id6">Step 4: Creating the Target for the my_sensor_app Application</a><a class="headerlink" href="#step-4-creating-the-target-for-the-my-sensor-app-application" title="Permalink to this headline">ΒΆ</a></h3>
<p>You create a target for the my_sensor_app to run on the Nordic Thingy.
The following syscfg settings must be set:</p>
<ul>
<li><p><code class="docutils literal notranslate"><span class="pre">I2C_0=1</span></code> : Enables the I2C interface 0 for the nRF52 Thingy BSP
HAL setting to communicate with the onboard sensor.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">LIS2DH12_ONB=1</span></code>: Enables the lis2dh12 onboard sensor support in
the nRF52 Thingy BSP.</p>
<p>A BSP with onboard sensors defines a syscfg setting for each onboard
sensor it supports and uses the naming convention
<code class="docutils literal notranslate"><span class="pre">&lt;SENSORNAME&gt;_ONB</span></code>. The <code class="docutils literal notranslate"><span class="pre">&lt;SENSORNAME&gt;_ONB</span></code> setting specifies
whether the sensor named SENSORNAME is enabled. The setting is
disabled by default. The BSP includes the sensor device driver
package <code class="docutils literal notranslate"><span class="pre">hw/drivers/sensors/&lt;sensorname&gt;</span></code> and creates and
configures the onboard sensor named SENSORNAME when the
<code class="docutils literal notranslate"><span class="pre">&lt;SENSORNAME&gt;_ONB</span></code> setting is enabled by the application.</p>
</li>
<li><p><code class="docutils literal notranslate"><span class="pre">SHELL_TASK=1</span></code>: Enables the shell task for the shell command
support. Note that the <code class="docutils literal notranslate"><span class="pre">hw/sensor</span></code> package enables the
<code class="docutils literal notranslate"><span class="pre">SENSOR_CLI</span></code> setting by default.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">SENSOR_OIC=0</span></code>: Disables the OIC sensor server support in the
sensor framework.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">CONSOLE_RTT=1</span></code>: Enables console communication via the SEGGER RTT.
The nRF52 Thingy does not have a UART so we use the RTT for the
console.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">CONSOLE_UART=0</span></code>: Disables the console communication via a UART.</p></li>
</ul>
<p><strong>Note:</strong> The lis2dh12 sensor device driver package,
<code class="docutils literal notranslate"><span class="pre">/hw/driver/sensors/lis2dh12</span></code>, currently does not support a shell
command to view information on the device.</p>
<p>1. Run the following newt commands to create the target and set the
application and BSP.</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>newt<span class="w"> </span>target<span class="w"> </span>create<span class="w"> </span>thingy_my_sensor
<span class="go">Target targets/thingy_my_sensor successfully created</span>
<span class="gp">$ </span>newt<span class="w"> </span>target<span class="w"> </span><span class="nb">set</span><span class="w"> </span>thingy_my_sensor<span class="w"> </span><span class="nv">bsp</span><span class="o">=</span>@apache-mynewt-core/hw/bsp/nrf52-thingy
<span class="go">Target targets/thingy_my_sensor successfully set target.bsp to @apache-mynewt-core/hw/bsp/nrf52-thingy</span>
<span class="gp">$ </span>newt<span class="w"> </span>target<span class="w"> </span><span class="nb">set</span><span class="w"> </span>thingy_my_sensor<span class="w"> </span><span class="nv">app</span><span class="o">=</span>apps/my_sensor_app
<span class="go">Target targets/thingy_my_sensor successfully set target.app to apps/my_sensor_app</span>
<span class="gp">$ </span>newt<span class="w"> </span>target<span class="w"> </span><span class="nb">set</span><span class="w"> </span>thingy_my_sensor<span class="w"> </span><span class="nv">build_profile</span><span class="o">=</span>debug
<span class="go">Target targets/thingy_my_sensor successfully set target.build_profile to debug</span>
</pre></div>
</div>
<p>2. Run the following <code class="docutils literal notranslate"><span class="pre">newt</span> <span class="pre">target</span> <span class="pre">set</span></code> command to set the syscfg
settings:</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>newt<span class="w"> </span>target<span class="w"> </span><span class="nb">set</span><span class="w"> </span>thingy_my_sensor<span class="w"> </span><span class="nv">syscfg</span><span class="o">=</span><span class="nv">I2C_0</span><span class="o">=</span><span class="m">1</span>:LIS2DH12_ONB<span class="o">=</span><span class="m">1</span>:SHELL_TASK<span class="o">=</span><span class="m">1</span>:CONSOLE_RTT<span class="o">=</span><span class="m">1</span>:CONSOLE_UART<span class="o">=</span><span class="m">0</span>:SENSOR_OIC<span class="o">=</span><span class="m">0</span>
<span class="go">Target targets/thingy_my_sensor successfully set target.syscfg to I2C_0=1:LIS2DH12_ONB=1:SHELL_TASK=1:CONSOLE_RTT=1:CONSOLE_UART=0:SENSOR_OIC=0</span>
</pre></div>
</div>
</div>
<div class="section" id="step-5-creating-and-building-the-bootloader-target">
<h3><a class="toc-backref" href="#id7">Step 5: Creating and Building the Bootloader Target</a><a class="headerlink" href="#step-5-creating-and-building-the-bootloader-target" title="Permalink to this headline">ΒΆ</a></h3>
<p>Create a target for the bootloader for the nRF52 Thingy. We name the
target <code class="docutils literal notranslate"><span class="pre">thingy_boot</span></code>.</p>
<ol class="arabic simple">
<li><p>Run the following <code class="docutils literal notranslate"><span class="pre">newt</span> <span class="pre">target</span></code> commands to create the target:</p></li>
</ol>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>newt<span class="w"> </span>target<span class="w"> </span>create<span class="w"> </span>thingy_boot
<span class="go">Target targets/thingy_boot successfully created</span>
<span class="gp">$ </span>newt<span class="w"> </span>target<span class="w"> </span><span class="nb">set</span><span class="w"> </span>thingy_boot<span class="w"> </span><span class="nv">bsp</span><span class="o">=</span>@apache-mynewt-core/hw/bsp/nrf52-thingy
<span class="go">Target targets/thingy_boot successfully set target.bsp to @apache-mynewt-core/hw/bsp/nrf52-thingy</span>
<span class="gp">$ </span>newt<span class="w"> </span>target<span class="w"> </span><span class="nb">set</span><span class="w"> </span>thingy_boot<span class="w"> </span><span class="nv">app</span><span class="o">=</span>@mcuboot/boot/mynewt
<span class="go">Target targets/thingy_boot successfully set target.app to @mcuboot/boot/mynewt</span>
<span class="gp">$ </span>newt<span class="w"> </span>target<span class="w"> </span><span class="nb">set</span><span class="w"> </span>thingy_boot<span class="w"> </span><span class="nv">build_profile</span><span class="o">=</span>optimized
<span class="go">Target targets/thingy_boot successfully set target.build_profile to optimized</span>
</pre></div>
</div>
<ol class="arabic simple" start="2">
<li><p>Run the <code class="docutils literal notranslate"><span class="pre">newt</span> <span class="pre">build</span></code> command to build the bootloader target:</p></li>
</ol>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>newt<span class="w"> </span>build<span class="w"> </span>thingy_boot
<span class="go">Building target targets/thingy_boot</span>
<span class="go"> ...</span>
<span class="go">Archiving thingy_boot-sysinit-app.a</span>
<span class="go">Archiving util_mem.a</span>
<span class="go">Linking ~/dev/myproj/bin/targets/thingy_boot/app/boot/mynewt/mynewt.elf</span>
<span class="go">Target successfully built: targets/thingy_boot</span>
</pre></div>
</div>
</div>
<div class="section" id="step-6-connecting-the-thingy-to-your-computer">
<h3><a class="toc-backref" href="#id8">Step 6: Connecting the Thingy to your Computer</a><a class="headerlink" href="#step-6-connecting-the-thingy-to-your-computer" title="Permalink to this headline">ΒΆ</a></h3>
<p>Perform the following steps to connect the Thingy to your computer:</p>
<ol class="arabic simple">
<li><p>Move the power switch to the left to power ON the Thingy:</p></li>
</ol>
<blockquote>
<div><p><img alt="Thingy" src="../../_images/thingy.jpg" /></p>
</div></blockquote>
<p>2. Connect the debug probe to the JTAG port on the board using the
Jlink 9-pin adapter and cable, and connect the probe to your computer.</p>
<blockquote>
<div><p><img alt="J-Link debug probe to Thingy" src="../../_images/thingy_jlink.jpg" /></p>
</div></blockquote>
<p></div>
<div class="section" id="step-7-loading-the-image-and-connecting-to-the-console-via-rtt">
<h3><a class="toc-backref" href="#id9">Step 7: Loading the Image and Connecting to the Console via RTT</a><a class="headerlink" href="#step-7-loading-the-image-and-connecting-to-the-console-via-rtt" title="Permalink to this headline">ΒΆ</a></h3>
<p>To run the application, you need to load the bootloader on to the
device, load the application image, and start a GDB debug process for
RTT to attach to.</p>
<ol class="arabic simple">
<li><p>Run the <code class="docutils literal notranslate"><span class="pre">newt</span> <span class="pre">load</span></code> command to load the bootloader:</p></li>
</ol>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>newt<span class="w"> </span>load<span class="w"> </span>thingy_boot
<span class="go">Loading bootloader</span>
</pre></div>
</div>
<p>2. Run the <code class="docutils literal notranslate"><span class="pre">newt</span> <span class="pre">run</span></code> command to build and create an image for the
my_sensor_app, load the image, and start a GDB process to debug the
application:</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>newt<span class="w"> </span>run<span class="w"> </span>thingy_my_sensor<span class="w"> </span><span class="m">1</span>.0.0
<span class="go">Assembling repos/apache-mynewt-core/hw/bsp/nrf52-thingy/src/arch/cortex_m4/gcc_startup_nrf52_split.s</span>
<span class="go">Compiling repos/apache-mynewt-core/hw/cmsis-core/src/cmsis_nvic.c</span>
<span class="go">Assembling repos/apache-mynewt-core/hw/bsp/nrf52-thingy/src/arch/cortex_m4/gcc_startup_nrf52.s</span>
<span class="go">Compiling repos/apache-mynewt-core/encoding/base64/src/hex.c</span>
<span class="go">Compiling apps/my_sensor_app/src/main.c</span>
<span class="go"> ...</span>
<span class="go">Archiving thingy_my_sensor-sysinit-app.a</span>
<span class="go">Archiving time_datetime.a</span>
<span class="go">Archiving util_cbmem.a</span>
<span class="go">Archiving util_crc.a</span>
<span class="go">Archiving util_mem.a</span>
<span class="go">Archiving util_parse.a</span>
<span class="go">Linking ~/dev/myproj/bin/targets/thingy_my_sensor/app/apps/my_sensor_app/my_sensor_app.elf</span>
<span class="go">App image succesfully generated: ~/dev/myproj/bin/targets/thingy_my_sensor/app/apps/my_sensor_app/my_sensor_app.img</span>
<span class="go">Loading app image into slot 1</span>
<span class="go">[~/dev/myproj/repos/apache-mynewt-core/hw/bsp/nrf52-thingy/nrf52-thingy_debug.sh ~/dev/myproj/repos/apache-mynewt-core/hw/bsp/nrf52-thingy ~/dev/myproj/bin/targets/thingy_my_sensor/app/apps/my_sensor_app/my_sensor_app]</span>
<span class="go">Debugging ~/dev/myproj/bin/targets/thingy_my_sensor/app/apps/my_sensor_app/my_sensor_app.elf</span>
<span class="go">GNU gdb (GNU Tools for ARM Embedded Processors) 7.8.0.20150604-cvs</span>
<span class="go">Copyright (C) 2014 Free Software Foundation, Inc.</span>
<span class="go">License GPLv3+: GNU GPL version 3 or later &lt;http://gnu.org/licenses/gpl.html&gt;</span>
<span class="go">This is free software: you are free to change and redistribute it.</span>
<span class="go">There is NO WARRANTY, to the extent permitted by law. Type &quot;show copying&quot;</span>
<span class="go">and &quot;show warranty&quot; for details.</span>
<span class="go">This GDB was configured as &quot;--host=x86_64-apple-darwin10 --target=arm-none-eabi&quot;.</span>
<span class="go">Type &quot;show configuration&quot; for configuration details.</span>
<span class="go">For bug reporting instructions, please see:</span>
<span class="go">&lt;http://www.gnu.org/software/gdb/bugs/&gt;.</span>
<span class="go">Find the GDB manual and other documentation resources online at:</span>
<span class="go">&lt;http://www.gnu.org/software/gdb/documentation/&gt;.</span>
<span class="go">For help, type &quot;help&quot;.</span>
<span class="go">Type &quot;apropos word&quot; to search for commands related to &quot;word&quot;...</span>
<span class="go">Reading symbols from ~/dev/myproj/bin/targets/thingy_my_sensor/app/apps/my_sensor_app/my_sensor_app.elf...done.</span>
<span class="go">os_tick_idle (ticks=24)</span>
<span class="go"> at repos/apache-mynewt-core/hw/mcu/nordic/nrf52xxx/src/hal_os_tick.c:204</span>
<span class="go">204 if (ticks &gt; 0) {</span>
<span class="go">Resetting target</span>
<span class="go">0x000000dc in ?? ()</span>
<span class="gp gp-VirtualEnv">(gdb)</span>
</pre></div>
</div>
<ol class="arabic simple" start="3">
<li><p>Enter <code class="docutils literal notranslate"><span class="pre">c</span> <span class="pre">&lt;return&gt;</span></code> in the (gdb) prompt to continue.</p></li>
</ol>
<p>4. Run the following telnet command to connect to the Mynewt console
via RTT and enter &lt;return&gt; to get the shell prompt after you are
connected.</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>telnet<span class="w"> </span>localhost<span class="w"> </span><span class="m">19021</span>
<span class="go">Trying ::1...</span>
<span class="go">telnet: connect to address ::1: Connection refused</span>
<span class="go">Trying 127.0.0.1...</span>
<span class="go">Connected to localhost.</span>
<span class="go">Escape character is &#39;^]&#39;.</span>
<span class="go">SEGGER J-Link V6.14h - Real time terminal output</span>
<span class="go">SEGGER J-Link ARM V10.0, SN=600000268</span>
<span class="go">Process: JLinkGDBServer</span>
<span class="go">011468 compat&gt;</span>
</pre></div>
</div>
</div>
<div class="section" id="step-8-viewing-the-list-of-sensors-and-sensor-data">
<h3><a class="toc-backref" href="#id10">Step 8: Viewing the list of Sensors and Sensor Data</a><a class="headerlink" href="#step-8-viewing-the-list-of-sensors-and-sensor-data" title="Permalink to this headline">ΒΆ</a></h3>
<p>1. Enter <code class="docutils literal notranslate"><span class="pre">sensor</span> <span class="pre">list</span></code> to see the sensors that are registered with
the sensor manager. You should see the <code class="docutils literal notranslate"><span class="pre">lis2dh12_0</span></code> sensor. This
sensor is only configured for the accelerometer (0x1).</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">011468 compat&gt; sensor list</span>
<span class="go">sensor list</span>
<span class="go">029706 sensor dev = lis2dh12_0, configured type = 0x1</span>
<span class="go">029707 compat&gt;</span>
</pre></div>
</div>
<p>2. Enter the <code class="docutils literal notranslate"><span class="pre">sensor</span> <span class="pre">read</span></code> command to read some data samples from the
accelerometer:</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">029707 compat&gt; sensor read lis2dh12_0 0x1 -n 5</span>
<span class="go">sensor read lis2dh12_0 0x1 -n 5</span>
<span class="go">042537 ts: [ secs: 331 usecs: 102682 cputime: 331436945 ]</span>
<span class="go">042537 x = 9.806650176 y = 58.839900992 z = -9894.910156</span>
<span class="go">042537 ts: [ secs: 331 usecs: 104832 cputime: 331439095 ]</span>
<span class="go">042537 x = 19.613300352 y = 98.066497804 z = -9924.330078</span>
<span class="go">042537 ts: [ secs: 331 usecs: 106988 cputime: 331441251 ]</span>
<span class="go">042537 x = 9.806650176 y = 49.033248902 z = -9904.716796</span>
<span class="go">042538 ts: [ secs: 331 usecs: 109137 cputime: 331443400 ]</span>
<span class="go">042538 x = 9.806650176 y = 29.419950496 z = -9904.716796</span>
<span class="go">042538 ts: [ secs: 331 usecs: 111288 cputime: 331445551 ]</span>
<span class="go">042538 x = 58.839900992 y = 0.000000000 z = -9816.457031</span>
<span class="go">042538 compat&gt;</span>
</pre></div>
</div>
</div>
<div class="section" id="extending-the-application-to-use-the-sensor-api-to-read-sensor-data">
<h3><a class="toc-backref" href="#id11">Extending the Application to Use the Sensor API to Read Sensor Data</a><a class="headerlink" href="#extending-the-application-to-use-the-sensor-api-to-read-sensor-data" title="Permalink to this headline">ΒΆ</a></h3>
<p>As this tutorial demonstrates so far, the Mynewt sensor framework
enables you to easily and quickly develop an application with a sensor
and view the sensor data from the <code class="docutils literal notranslate"><span class="pre">sensor</span></code> shell command. We now
extend the application to use the sensor API to read the sensor data.</p>
<p>There are two sensor functions that you can use to read data from a
sensor device:</p>
<ul>
<li><p><code class="docutils literal notranslate"><span class="pre">sensor_register_listener()</span></code>: This function allows you to register
a listener for a sensor device. You specify a bit mask of the types
of sensor data to listen for and a callback to call when data is read
from the sensor device. The listener callback is called whenever the
<code class="docutils literal notranslate"><span class="pre">sensor_read()</span></code> function reads data for a sensor type from a sensor
device that the listener is listening for.</p>
<p>The sensor framework supports polling of sensor devices. For a sensor
device that has a polling rate configured, the sensor framework
poller reads sensor data for all the configured sensor types from the
sensor device at each polling interval and calls the registered
listener callbacks with the sensor data.</p>
</li>
<li><p><code class="docutils literal notranslate"><span class="pre">sensor_read()</span></code>: This function reads sensor data from a sensor
device and calls the specified user callback to receive the sensor
data. You specify a bit mask of the types of sensor data to read from
a sensor device and a callback. This callback is called for each
sensor type you specify to read.</p></li>
</ul>
<p>We first extend the application to a register a sensor listener to
demonstrate how to use the sensor framework polling support. We then
extend the application to use the <code class="docutils literal notranslate"><span class="pre">sensor_read()</span></code> function instead of
a listener. An application may not need to poll sensors. For example, an
application that processes remote requests for sensor data might only
read the sensor data when it receives a request.</p>
</div>
<div class="section" id="step-1-modifying-main-c-to-add-a-sensor-listener">
<h3><a class="toc-backref" href="#id12">Step 1: Modifying main.c to Add a Sensor Listener</a><a class="headerlink" href="#step-1-modifying-main-c-to-add-a-sensor-listener" title="Permalink to this headline">ΒΆ</a></h3>
<p>Add the following code to the <code class="docutils literal notranslate"><span class="pre">my_sensor_app/src/main.c</span></code> file:</p>
<ol class="arabic simple">
<li><p>Add the highlighted include files:</p></li>
</ol>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&quot;sysinit/sysinit.h&quot;</span>
<span class="w"> </span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&quot;os/os.h&quot;</span>
<span class="hll"><span class="w"> </span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;defs/error.h&gt;</span>
</span><span class="hll"><span class="w"> </span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;sensor/sensor.h&gt;</span>
</span><span class="hll"><span class="w"> </span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;sensor/accel.h&gt;</span>
</span><span class="hll"><span class="w"> </span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;console/console.h&gt;</span>
</span></pre></div>
</div>
<p>2. Add the <code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">sensor</span> <span class="pre">*my_sensor</span></code>. This is the handle for the
sensor that the sensor API uses to perform operations on the sensor. We
set this variable when we lookup the sensor.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="k">static</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">sensor</span><span class="w"> </span><span class="o">*</span><span class="n">my_sensor</span><span class="p">;</span>
</pre></div>
</div>
<p>3. Declare and initialize a sensor listener. You specify a bit mask for
the sensor types to listen for, the callback function, and an opaque
argument to pass to the callback. You initialize the type to
SENSOR_TYPE_ACCELEROMETER, the listener callback to the
<code class="docutils literal notranslate"><span class="pre">read_accelerometer()</span></code> function, and the callback opaque argument to
the LISTENER_CB value.</p>
<p><strong>Note</strong>: We define LISTENER_CB and READ_CB values because we also use
the <code class="docutils literal notranslate"><span class="pre">read_accelerometer()</span></code> function as the callback for the
<code class="docutils literal notranslate"><span class="pre">sensor_read()</span></code> function later in the tutorial. The LISTENER_CB or
the READ_CB value is passed to the <code class="docutils literal notranslate"><span class="pre">read_accelerometer()</span></code> function to
indicate whether it is invoked as a listener or a <code class="docutils literal notranslate"><span class="pre">sensor_read()</span></code>
callback.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cp">#define LISTENER_CB 1</span>
<span class="cp">#define READ_CB 2</span>
<span class="k">static</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">read_accelerometer</span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">sensor</span><span class="o">*</span><span class="w"> </span><span class="n">sensor</span><span class="p">,</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="n">arg</span><span class="p">,</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="n">databuf</span><span class="p">,</span><span class="w"> </span><span class="n">sensor_type_t</span><span class="w"> </span><span class="n">type</span><span class="p">);</span>
<span class="k">static</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">sensor_listener</span><span class="w"> </span><span class="n">listener</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="p">.</span><span class="n">sl_sensor_type</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SENSOR_TYPE_ACCELEROMETER</span><span class="p">,</span>
<span class="w"> </span><span class="p">.</span><span class="n">sl_func</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">read_accelerometer</span><span class="p">,</span>
<span class="w"> </span><span class="p">.</span><span class="n">sl_arg</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="n">LISTENER_CB</span><span class="p">,</span>
<span class="p">};</span>
</pre></div>
</div>
<p>4. Add the code for the <code class="docutils literal notranslate"><span class="pre">read_accelerometer()</span></code> function. The sensor
data is stored in the <code class="docutils literal notranslate"><span class="pre">databuf</span></code> and <code class="docutils literal notranslate"><span class="pre">type</span></code> specifies the type of
sensor data.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="k">static</span><span class="w"> </span><span class="kt">int</span>
<span class="nf">read_accelerometer</span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">sensor</span><span class="o">*</span><span class="w"> </span><span class="n">sensor</span><span class="p">,</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="n">arg</span><span class="p">,</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="n">databuf</span><span class="p">,</span><span class="w"> </span><span class="n">sensor_type_t</span><span class="w"> </span><span class="n">type</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="n">tmpstr</span><span class="p">[</span><span class="mi">13</span><span class="p">];</span>
<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">sensor_accel_data</span><span class="w"> </span><span class="o">*</span><span class="n">sad</span><span class="p">;</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">databuf</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">SYS_EINVAL</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="n">sad</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">sensor_accel_data</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="n">databuf</span><span class="p">;</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">sad</span><span class="o">-&gt;</span><span class="n">sad_x_is_valid</span><span class="w"> </span><span class="o">||</span>
<span class="w"> </span><span class="o">!</span><span class="n">sad</span><span class="o">-&gt;</span><span class="n">sad_y_is_valid</span><span class="w"> </span><span class="o">||</span>
<span class="w"> </span><span class="o">!</span><span class="n">sad</span><span class="o">-&gt;</span><span class="n">sad_z_is_valid</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">SYS_EINVAL</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="n">console_printf</span><span class="p">(</span><span class="s">&quot;%s: [ secs: %ld usecs: %d cputime: %u ]</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="p">((</span><span class="kt">int</span><span class="p">)</span><span class="n">arg</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">LISTENER_CB</span><span class="p">)</span><span class="w"> </span><span class="o">?</span><span class="w"> </span><span class="s">&quot;LISTENER_CB&quot;</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="s">&quot;READ_CB&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="p">(</span><span class="kt">long</span><span class="w"> </span><span class="kt">int</span><span class="p">)</span><span class="n">sensor</span><span class="o">-&gt;</span><span class="n">s_sts</span><span class="p">.</span><span class="n">st_ostv</span><span class="p">.</span><span class="n">tv_sec</span><span class="p">,</span>
<span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">sensor</span><span class="o">-&gt;</span><span class="n">s_sts</span><span class="p">.</span><span class="n">st_ostv</span><span class="p">.</span><span class="n">tv_usec</span><span class="p">,</span>
<span class="w"> </span><span class="p">(</span><span class="kt">unsigned</span><span class="w"> </span><span class="kt">int</span><span class="p">)</span><span class="n">sensor</span><span class="o">-&gt;</span><span class="n">s_sts</span><span class="p">.</span><span class="n">st_cputime</span><span class="p">);</span>
<span class="w"> </span><span class="n">console_printf</span><span class="p">(</span><span class="s">&quot;x = %s &quot;</span><span class="p">,</span><span class="w"> </span><span class="n">sensor_ftostr</span><span class="p">(</span><span class="n">sad</span><span class="o">-&gt;</span><span class="n">sad_x</span><span class="p">,</span><span class="w"> </span><span class="n">tmpstr</span><span class="p">,</span><span class="w"> </span><span class="mi">13</span><span class="p">));</span>
<span class="w"> </span><span class="n">console_printf</span><span class="p">(</span><span class="s">&quot;y = %s &quot;</span><span class="p">,</span><span class="w"> </span><span class="n">sensor_ftostr</span><span class="p">(</span><span class="n">sad</span><span class="o">-&gt;</span><span class="n">sad_y</span><span class="p">,</span><span class="w"> </span><span class="n">tmpstr</span><span class="p">,</span><span class="w"> </span><span class="mi">13</span><span class="p">));</span>
<span class="w"> </span><span class="n">console_printf</span><span class="p">(</span><span class="s">&quot;z = %s</span><span class="se">\n\n</span><span class="s">&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">sensor_ftostr</span><span class="p">(</span><span class="n">sad</span><span class="o">-&gt;</span><span class="n">sad_z</span><span class="p">,</span><span class="w"> </span><span class="n">tmpstr</span><span class="p">,</span><span class="w"> </span><span class="mi">13</span><span class="p">));</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</div>
<p>5. Set the poll rate for the sensor to two seconds. The
<code class="docutils literal notranslate"><span class="pre">sensor_set_poll_rate_ms()</span></code> function sets the poll rate for a named
sensor.</p>
<p><strong>Note:</strong> You set the poll rate for a sensor programmatically and must
set the poll rate to a non zero value in order for the sensor manager to
poll the sensor. You may set a different poll rate for each sensor. The
sensor framework also defines a <code class="docutils literal notranslate"><span class="pre">SENSOR_MGR_WAKEUP_RATE</span></code> syscfg
setting that specifies the default rate that the sensor manager polls.
The sensor manager uses the poll rate for a sesnor if a sensor is
configured to poll more frequently than the <code class="docutils literal notranslate"><span class="pre">SENSOR_MGR_WAKEUP_RATE</span></code>
setting value.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="hll"><span class="w"> </span><span class="cp">#define MY_SENSOR_DEVICE &quot;lis2dh12_0&quot;</span>
</span><span class="hll"><span class="w"> </span><span class="cp">#define MY_SENSOR_POLL_TIME 2000</span>
</span>
<span class="w"> </span><span class="kt">int</span>
<span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">argc</span><span class="p">,</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">**</span><span class="n">argv</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="hll"><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">rc</span><span class="p">;</span>
</span>
<span class="w"> </span><span class="p">...</span>
<span class="w"> </span><span class="cm">/* Initialize all packages. */</span>
<span class="w"> </span><span class="n">sysinit</span><span class="p">();</span>
<span class="hll"><span class="w"> </span><span class="n">rc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">sensor_set_poll_rate_ms</span><span class="p">(</span><span class="n">MY_SENSOR_DEVICE</span><span class="p">,</span><span class="w"> </span><span class="n">MY_SENSOR_POLL_TIME</span><span class="p">);</span>
</span><span class="hll"><span class="w"> </span><span class="n">assert</span><span class="p">(</span><span class="n">rc</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="p">);</span>
</span>
<span class="w"> </span><span class="cm">/* As the last thing, process events from default event queue. */</span>
<span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">os_eventq_run</span><span class="p">(</span><span class="n">os_eventq_dflt_get</span><span class="p">());</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
</pre></div>
</div>
<p>6. Look up the sensor by name to get the handle for the sensor and
register a listener for the sensor.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="kt">int</span>
<span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">argc</span><span class="p">,</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">**</span><span class="n">argv</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="p">...</span>
<span class="w"> </span><span class="n">rc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">sensor_set_poll_rate_ms</span><span class="p">(</span><span class="n">MY_SENSOR_DEVICE</span><span class="p">,</span><span class="w"> </span><span class="n">MY_SENSOR_POLL_TIME</span><span class="p">);</span>
<span class="w"> </span><span class="n">assert</span><span class="p">(</span><span class="n">rc</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="p">);</span>
<span class="hll"><span class="w"> </span><span class="n">my_sensor</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">sensor_mgr_find_next_bydevname</span><span class="p">(</span><span class="n">MY_SENSOR_DEVICE</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">);</span>
</span><span class="hll"><span class="w"> </span><span class="n">assert</span><span class="p">(</span><span class="n">my_sensor</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">);</span>
</span><span class="hll"><span class="w"> </span><span class="n">rc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">sensor_register_listener</span><span class="p">(</span><span class="n">my_sensor</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">listener</span><span class="p">);</span>
</span><span class="hll"><span class="w"> </span><span class="n">assert</span><span class="p">(</span><span class="n">rc</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="p">);</span>
</span>
<span class="w"> </span><span class="cm">/* As the last thing, process events from default event queue. */</span>
<span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">os_eventq_run</span><span class="p">(</span><span class="n">os_eventq_dflt_get</span><span class="p">());</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
</pre></div>
</div>
</div>
<div class="section" id="step-2-rebuilding-the-application-and-connecting-to-console">
<h3><a class="toc-backref" href="#id13">Step 2: Rebuilding the Application and Connecting to Console</a><a class="headerlink" href="#step-2-rebuilding-the-application-and-connecting-to-console" title="Permalink to this headline">ΒΆ</a></h3>
<p>1. Run the <code class="docutils literal notranslate"><span class="pre">newt</span> <span class="pre">run</span></code> command to rebuild the application, create a
new image, load the image, and start a GDB process:</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>newt<span class="w"> </span>run<span class="w"> </span>thingy_my_sensor<span class="w"> </span><span class="m">2</span>.0.0
<span class="go">Compiling apps/my_sensor_app/src/main.c</span>
<span class="go">Archiving apps_my_sensor_app.a</span>
<span class="go">Linking ~/dev/myproj/bin/targets/thingy_my_sensor/app/apps/my_sensor_app/my_sensor_app.elf</span>
<span class="go">App image succesfully generated: ~/dev/myproj/bin/targets/thingy_my_sensor/app/apps/my_sensor_app/my_sensor_app.img</span>
<span class="go">Loading app image into slot 1</span>
<span class="go">[~/dev/myproj/repos/apache-mynewt-core/hw/bsp/nrf52-thingy/nrf52-thingy_debug.sh ~/dev/myproj/repos/apache-mynewt-core/hw/bsp/nrf52-thingy ~/dev/myproj/bin/targets/thingy_my_sensor/app/apps/my_sensor_app/my_sensor_app]</span>
<span class="go">Debugging ~/dev/myproj/bin/targets/thingy_my_sensor/app/apps/my_sensor_app/my_sensor_app.elf</span>
<span class="go">GNU gdb (GNU Tools for ARM Embedded Processors) 7.8.0.20150604-cvs</span>
<span class="go"> ...</span>
<span class="go">Reading symbols from ~/dev/myproj/bin/targets/thingy_my_sensor/app/apps/my_sensor_app/my_sensor_app.elf...done.</span>
<span class="go">os_tick_idle (ticks=12)</span>
<span class="go"> at repos/apache-mynewt-core/hw/mcu/nordic/nrf52xxx/src/hal_os_tick.c:204</span>
<span class="go">204 if (ticks &gt; 0) {</span>
<span class="go">Resetting target</span>
<span class="go">0x000000dc in ?? ()</span>
<span class="gp gp-VirtualEnv">(gdb)</span> <span class="go">c</span>
<span class="go">Continuing.</span>
</pre></div>
</div>
<ol class="arabic simple" start="2">
<li><p>Connect to the console via RTT:</p></li>
</ol>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>telnet<span class="w"> </span>localhost<span class="w"> </span><span class="m">19021</span>
<span class="go"> Connected to localhost.</span>
<span class="go"> Escape character is &#39;^]&#39;.</span>
<span class="go"> SEGGER J-Link V6.14h - Real time terminal output</span>
<span class="go"> J-Link OB-SAM3U128-V2-NordicSemi compiled Mar 2 2017 12:22:13 V1.0, SN=682562963</span>
<span class="go"> Process: JLinkGDBServer</span>
<span class="go"> 000003 LISTENER_CB: [ secs: 0 usecs: 23407 cputime: 331783 ]</span>
<span class="go"> 000003 x = 117.67980192 y = -19.61330035 z = -9885.103515</span>
<span class="go"> 000259 LISTENER_CB: [ secs: 2 usecs: 21190 cputime: 2327645 ]</span>
<span class="go"> 000259 x = 117.67980192 y = -9.806650176 z = -9914.523437</span>
<span class="go"> 000515 LISTENER_CB: [ secs: 4 usecs: 17032 cputime: 4323487 ]</span>
<span class="go"> 000515 x = 78.453201280 y = 0.000000000 z = -9924.330078</span>
<span class="go"> 000771 LISTENER_CB: [ secs: 6 usecs: 13131 cputime: 6319586 ]</span>
<span class="go"> 000771 x = 117.67980192 y = -19.61330035 z = -9914.523437</span>
<span class="go"> 001027 LISTENER_CB: [ secs: 8 usecs: 8810 cputime: 8315265 ]</span>
<span class="go"> 001027 x = 127.48645020 y = 0.000000000 z = -9924.330078</span>
<span class="go"> 001283 LISTENER_CB: [ secs: 10 usecs: 4964 cputime: 10311419 ]</span>
<span class="go"> 001283 x = 58.839900992 y = -9.806650176 z = -9885.103515</span>
</pre></div>
</div>
<p>You should see the accelerometer sensor data output from the listener
callback.</p>
</div>
<div class="section" id="step-3-modifying-main-c-to-use-sensor-read-instead-of-a-listener">
<h3><a class="toc-backref" href="#id14">Step 3: Modifying main.c to Use sensor_read() Instead of a Listener</a><a class="headerlink" href="#step-3-modifying-main-c-to-use-sensor-read-instead-of-a-listener" title="Permalink to this headline">ΒΆ</a></h3>
<p>Lets extend the application to use the <code class="docutils literal notranslate"><span class="pre">sensor_read()</span></code> function
instead of a listener. We setup an OS callout to call the
<code class="docutils literal notranslate"><span class="pre">sensor_read()</span></code> function for illustration purposes. A real application
will most likely read the sensor data when it gets a request or some
other event.</p>
<p>1. Add an OS callout and initialize an OS timer to fire every 5
seconds. The timer callback calls the <code class="docutils literal notranslate"><span class="pre">sensor_read()</span></code> function to read
the sensor data. The <code class="docutils literal notranslate"><span class="pre">read_accelerometer()</span></code> callback is called when
the sensor data is read. The READ_CB value is passed to the
<code class="docutils literal notranslate"><span class="pre">read_accelerometer()</span></code> function and indicates that the callback is
from the <code class="docutils literal notranslate"><span class="pre">sensor_read()</span></code> function and not from the listener.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cm">/*</span>
<span class="cm"> * Event callback function for timer events. The callback reads the sensor data</span>
<span class="cm"> */</span>
<span class="cp">#define READ_SENSOR_INTERVAL (5 * OS_TICKS_PER_SEC)</span>
<span class="k">static</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">os_callout</span><span class="w"> </span><span class="n">sensor_callout</span><span class="p">;</span>
<span class="k">static</span><span class="w"> </span><span class="kt">void</span>
<span class="nf">timer_ev_cb</span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">os_event</span><span class="w"> </span><span class="o">*</span><span class="n">ev</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="n">assert</span><span class="p">(</span><span class="n">ev</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">);</span>
<span class="w"> </span><span class="cm">/*</span>
<span class="cm"> * Read the accelerometer sensor. Pass the READ_CB value for the callback opaque</span>
<span class="cm"> * arg to indicate that it is the sensor_read() callback.</span>
<span class="cm"> */</span>
<span class="w"> </span><span class="n">sensor_read</span><span class="p">(</span><span class="n">my_sensor</span><span class="p">,</span><span class="w"> </span><span class="n">SENSOR_TYPE_ACCELEROMETER</span><span class="p">,</span><span class="w"> </span><span class="n">read_accelerometer</span><span class="p">,</span>
<span class="w"> </span><span class="p">(</span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="n">READ_CB</span><span class="p">,</span><span class="w"> </span><span class="n">OS_TIMEOUT_NEVER</span><span class="p">);</span>
<span class="w"> </span><span class="n">os_callout_reset</span><span class="p">(</span><span class="o">&amp;</span><span class="n">sensor_callout</span><span class="p">,</span><span class="w"> </span><span class="n">READ_SENSOR_INTERVAL</span><span class="p">);</span>
<span class="w"> </span><span class="k">return</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">static</span><span class="w"> </span><span class="kt">void</span>
<span class="nf">init_timer</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="cm">/*</span>
<span class="cm"> * Initialize the callout for a timer event.</span>
<span class="cm"> */</span>
<span class="w"> </span><span class="n">os_callout_init</span><span class="p">(</span><span class="o">&amp;</span><span class="n">sensor_callout</span><span class="p">,</span><span class="w"> </span><span class="n">os_eventq_dflt_get</span><span class="p">(),</span>
<span class="w"> </span><span class="n">timer_ev_cb</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">);</span>
<span class="w"> </span><span class="n">os_callout_reset</span><span class="p">(</span><span class="o">&amp;</span><span class="n">sensor_callout</span><span class="p">,</span><span class="w"> </span><span class="n">READ_SENSOR_INTERVAL</span><span class="p">);</span>
<span class="w"> </span><span class="k">return</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</div>
<p>2. Remove the listener registration and call the <code class="docutils literal notranslate"><span class="pre">init_timer()</span></code>
function in <code class="docutils literal notranslate"><span class="pre">main()</span></code>. You can delete the
<code class="docutils literal notranslate"><span class="pre">sensor_register_listener()</span></code> function call, but we call the
<code class="docutils literal notranslate"><span class="pre">sensor_unregister_listener()</span></code> function to illustrate how to use this
function.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="kt">int</span>
<span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">argc</span><span class="p">,</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">**</span><span class="n">argv</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="p">...</span>
<span class="w"> </span><span class="n">assert</span><span class="p">(</span><span class="n">my_sensor</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">);</span>
<span class="w"> </span><span class="n">rc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">sensor_register_listener</span><span class="p">(</span><span class="n">my_sensor</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">listener</span><span class="p">);</span>
<span class="w"> </span><span class="n">assert</span><span class="p">(</span><span class="n">rc</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="p">);</span>
<span class="hll"><span class="w"> </span><span class="n">rc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">sensor_unregister_listener</span><span class="p">(</span><span class="n">my_sensor</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">listener</span><span class="p">);</span>
</span><span class="hll"><span class="w"> </span><span class="n">assert</span><span class="p">(</span><span class="n">rc</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="p">);</span>
</span>
<span class="hll"><span class="w"> </span><span class="n">init_timer</span><span class="p">();</span>
</span>
<span class="w"> </span><span class="cm">/* As the last thing, process events from default event queue. */</span>
<span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">os_eventq_run</span><span class="p">(</span><span class="n">os_eventq_dflt_get</span><span class="p">());</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
</pre></div>
</div>
</div>
<div class="section" id="step-4-rebuilding-the-application-and-connecting-to-console">
<h3><a class="toc-backref" href="#id15">Step 4: Rebuilding the Application and Connecting to Console</a><a class="headerlink" href="#step-4-rebuilding-the-application-and-connecting-to-console" title="Permalink to this headline">ΒΆ</a></h3>
<p>1. Run the <code class="docutils literal notranslate"><span class="pre">newt</span> <span class="pre">run</span></code> command to rebuild the application, create an new
image, and start a GDB process:</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>newt<span class="w"> </span>run<span class="w"> </span>thingy_my_sensor<span class="w"> </span><span class="m">3</span>.0.0
<span class="go">Compiling apps/my_sensor_app/src/main.c</span>
<span class="go">Archiving apps_my_sensor_app.a</span>
<span class="go">Linking ~/dev/myproj/bin/targets/thingy_my_sensor/app/apps/my_sensor_app/my_sensor_app.elf</span>
<span class="go">App image succesfully generated: ~/dev/myproj/bin/targets/thingy_my_sensor/app/apps/my_sensor_app/my_sensor_app.img</span>
<span class="go">Loading app image into slot 1</span>
<span class="go">[~/dev/myproj/repos/apache-mynewt-core/hw/bsp/nrf52-thingy/nrf52-thingy_debug.sh ~/dev/myproj/repos/apache-mynewt-core/hw/bsp/nrf52-thingy ~/dev/myproj/bin/targets/thingy_my_sensor/app/apps/my_sensor_app/my_sensor_app]</span>
<span class="go">Debugging ~/dev/myproj/bin/targets/thingy_my_sensor/app/apps/my_sensor_app/my_sensor_app.elf</span>
<span class="go">GNU gdb (GNU Tools for ARM Embedded Processors) 7.8.0.20150604-cvs</span>
<span class="go"> ...</span>
<span class="go">Reading symbols from ~/dev/myproj/bin/targets/thingy_my_sensor/app/apps/my_sensor_app/my_sensor_app.elf...done.</span>
<span class="go">os_tick_idle (ticks=12)</span>
<span class="go"> at repos/apache-mynewt-core/hw/mcu/nordic/nrf52xxx/src/hal_os_tick.c:204</span>
<span class="go">204 if (ticks &gt; 0) {</span>
<span class="go">Resetting target</span>
<span class="go">0x000000dc in ?? ()</span>
<span class="gp gp-VirtualEnv">(gdb)</span> <span class="go">c</span>
<span class="go">Continuing.</span>
</pre></div>
</div>
<ol class="arabic simple" start="3">
<li><p>Connect to the console via RTT:</p></li>
</ol>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>telnet<span class="w"> </span>localhost<span class="w"> </span><span class="m">19021</span>
<span class="go">Trying ::1...</span>
<span class="go">telnet: connect to address ::1: Connection refused</span>
<span class="go">Trying 127.0.0.1...</span>
<span class="go">Connected to localhost.</span>
<span class="go">Escape character is &#39;^]&#39;.</span>
<span class="go">SEGGER J-Link V6.14h - Real time terminal output</span>
<span class="go">J-Link OB-SAM3U128-V2-NordicSemi compiled Mar 2 2017 12:22:13 V1.0, SN=682562963</span>
<span class="go">Process: JLinkGDBServer</span>
<span class="go">000629 compat&gt; READ_CB: [ secs: 5 usecs: 4088 cputime: 5295643 ]</span>
<span class="go">000642 x = 98.066497804 y = 0.000000000 z = -9806.650390</span>
<span class="go">001282 READ_CB: [ secs: 9 usecs: 992459 cputime: 10284014 ]</span>
<span class="go">001282 x = 117.67980192 y = -39.22660064 z = -9894.910156</span>
<span class="go">001922 READ_CB: [ secs: 14 usecs: 981159 cputime: 15272714 ]</span>
<span class="go">001922 x = 78.453201280 y = -29.41995049 z = -9885.103515</span>
<span class="go">002562 READ_CB: [ secs: 19 usecs: 970088 cputime: 20261643 ]</span>
<span class="go">002562 x = 107.87315366 y = -29.41995049 z = -9885.103515</span>
</pre></div>
</div>
<p>You should see the accelerometer sensor data output from the sensor read
data callback.</p>
</div>
</div>
</div>
</div>
</div>
<div class="rst-footer-buttons row" role="navigation" aria-label="footer navigation">
<a href="sensor_oic_overview.html" class="btn btn-neutral float-right" title="Enabling OIC Sensor Data Monitoring" accesskey="n">Next: Enabling OIC Sensor Data Monitoring <span class="fa fa-arrow-circle-right"></span></a>
<a href="sensor_offboard_config.html" class="btn btn-neutral" title="Changing the Default Configuration for a Sensor" accesskey="p"><span class="fa fa-arrow-circle-left"></span> Previous: Changing the Default Configuration for a Sensor</a>
</div>
</div>
</div>
</div>
<!-- ENDS CONTENT SECTION -->
</div>
<!-- ENDS .content -->
</div>
</div>
<footer>
<div class="container">
<div class="row">
<div class="col-xs-12">
<p class="copyright">Apache Mynewt is available under Apache License, version 2.0.</p>
</div>
<div class="col-xs-12">
<div class="logos">
<img src="../../_static/img/asf_logo_wide_small.png" alt="Apache" title="Apache">
<small class="footnote">
Apache Mynewt, Mynewt, Apache, the Apache feather logo, and the Apache Mynewt project logo are either
registered trademarks or trademarks of the Apache Software Foundation in the United States and other countries.
</small>
<a href="">
<img src="../../_static/img/add_to_slack.png" alt="Slack Icon" title="Join our Slack Community" />
</a>
</div>
</div>
</div>
</div>
</footer>
</div>
<!-- ENDS #wrapper -->
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT:'../../',
VERSION:'latest',
COLLAPSE_INDEX:false,
FILE_SUFFIX:'.html',
HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt',
LINK_SUFFIX: '.html'
};
</script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
<script type="text/javascript" src="../../_static/js/bootstrap-3.0.3.min.js"></script>
<script type="text/javascript" src="../../_static/js/affix.js"></script>
<script type="text/javascript" src="../../_static/js/main.js"></script>
</body>
</html>