You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by ad...@apache.org on 2017/02/24 23:05:11 UTC

[1/3] incubator-mynewt-site git commit: Added etape sensor tutorial. PR #152.

Repository: incubator-mynewt-site
Updated Branches:
  refs/heads/master bf9737dec -> 6c1d0e73e


Added etape sensor tutorial. PR #152.


Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-site/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-site/commit/55a2604c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-site/tree/55a2604c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-site/diff/55a2604c

Branch: refs/heads/master
Commit: 55a2604ccc698d862e2279299ab0150b8970368e
Parents: bf9737d
Author: aditihilbert <ad...@runtime.io>
Authored: Wed Feb 15 21:52:54 2017 -0800
Committer: aditihilbert <ad...@runtime.io>
Committed: Wed Feb 15 21:52:54 2017 -0800

----------------------------------------------------------------------
 docs/os/tutorials/nrf52_adc.md                  | 875 +++++++++++++++++++
 .../os/tutorials/pics/MyNewtSensorReader006.jpg | Bin 0 -> 211399 bytes
 docs/os/tutorials/pics/adc-demo-1.png           | Bin 0 -> 530153 bytes
 docs/os/tutorials/pics/adc-demo-2.png           | Bin 0 -> 435709 bytes
 docs/os/tutorials/pics/breadboard.png           | Bin 0 -> 546231 bytes
 5 files changed, 875 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-site/blob/55a2604c/docs/os/tutorials/nrf52_adc.md
----------------------------------------------------------------------
diff --git a/docs/os/tutorials/nrf52_adc.md b/docs/os/tutorials/nrf52_adc.md
new file mode 100644
index 0000000..643d66f
--- /dev/null
+++ b/docs/os/tutorials/nrf52_adc.md
@@ -0,0 +1,875 @@
+## Adding an Analog Sensor on nRF52
+
+<br>
+
+### Objective
+
+We will be adding an analog sensor to the NRF52DK development board and using the Analog to Digital Converter
+(ADC) to read the values from the sensor. It's also using Bluetooth to allow you to connect to the app and
+read the value of the sensor. Please see the following section for the required hardware
+in order to complete this tutorial.
+
+<br>
+
+### Hardware needed
+
+* nRF52 Development Kit (one of the following)
+    * Dev Kit from Nordic - PCA 10040
+    * Eval Kit from Rigado - BMD-300-EVAL-ES
+* eTape Liquid Sensor -- buy from [Adafruit](https://www.adafruit.com/products/1786)
+* Laptop running Mac OS
+* It is assumed you have already installed newt tool. 
+* It is assumed you already installed native tools as described [here](../get_started/native_tools.md)
+
+<br>
+
+### Create a project.  
+
+Create a new project to hold your work.  For a deeper understanding, you can read about project creation in 
+[Get Started -- Creating Your First Project](../get_started/project_create.md)
+or just follow the commands below.
+
+```
+    $ mkdir ~/dev
+    $ cd ~/dev
+    $ newt new myadc
+    Downloading project skeleton from apache/incubator-mynewt-blinky...
+    Installing skeleton in myadc...
+    Project myadc successfully created.
+    $ cd myadc
+    
+``` 
+
+<br>
+
+###Add Additional Repositories
+
+The board-specific libraries for the NRF52dk board are in an external repository at present, so
+you'll need to include that remote repository and install it as well. If you're not familiar
+with using repositories, see the section on [repositories](repo/add_repos.md) before
+continuing. Or just copy and paste the following.
+
+In your `project.yml` file, add `- mynewt_nordic` to the `project.repositories` section, and 
+then add the proper repository definition. When you're done, your `project.yml` file
+should look like this:
+
+```
+project.name: "my_project"
+
+project.repositories:
+    - apache-mynewt-core
+    - mynewt_nordic
+
+# Use github's distribution mechanism for core ASF libraries.
+# This provides mirroring automatically for us.
+#
+repository.apache-mynewt-core:
+    type: github
+    vers: 0-dev
+    user: apache
+    repo: incubator-mynewt-core
+repository.mynewt_nordic:
+    type: github
+    vers: 0-latest
+    user: runtimeinc
+    repo: mynewt_nordic
+```
+
+<br>
+
+###Install Everything
+
+Now that you have defined the needed repositories, it's time to install everything so
+that you can get started.
+
+```
+    $ newt install -v 
+    apache-mynewt-core
+    Downloading repository description for apache-mynewt-core... success!
+    ...
+    apache-mynewt-core successfully installed version 0.9.0-none
+    ...
+    mynewt_nordic
+    Downloading repository description for mynewt_nordic... success!
+    ...
+    mynewt_nordic successfully installed version 0.9.9-none
+```
+
+<br>
+
+### Create the targets
+
+Create two targets - one for the bootloader and one for the nrf52 board.  
+
+<font color="#F2853F">
+Note: The correct bsp must be chosen for the board you are using. </font>
+
+* For the Nordic Dev Kit choose @apache-mynewt-core/hw/bsp/nrf52dk instead (in the highlighted lines)
+* For the Rigado Eval Kit choose @apache-mynewt-core/hw/bsp/bmd300eval instead (in the highlighted lines)
+
+For the app itself we're going to extend the [bleprph](belpprph/bleprph-app.md) app so that we
+get the Bluetooth communications built in, so the first thing we'll need to do is copy that app
+into our own app directory:
+
+```no-highlight
+$ mkdir -p apps/nrf52_adc
+$ cp -Rp repos/apache-mynewt-core/apps/bleprph/* apps/nrf52_adc
+```
+
+Next, you'll modify the `pkg.yml` file for your app. Note the change in `pkg.name` and `pkg.description`. Also make sure that you specify the full path of all the packages with the prefix `@apache-mynewt-core/` as shown in the third highlighted line.
+
+```hl_lines="3 5 11"
+$ cat apps/nrf52_adc/pkg.yml
+...
+pkg.name: apps/nrf52_adc
+pkg.type: app
+pkg.description: Simple BLE peripheral application for ADC Sensors.
+pkg.author: "Apache Mynewt <de...@mynewt.incubator.apache.org>"
+pkg.homepage: "http://mynewt.apache.org/"
+pkg.keywords:
+
+pkg.deps: 
+    - "@apache-mynewt-core/boot/split"
+    - "@apache-mynewt-core/kernel/os"
+    - "@apache-mynewt-core/mgmt/imgmgr"
+    - "@apache-mynewt-core/mgmt/newtmgr"
+    - "@apache-mynewt-core/mgmt/newtmgr/transport/ble"
+    - "@apache-mynewt-core/net/nimble/controller"
+    - "@apache-mynewt-core/net/nimble/host"
+    - "@apache-mynewt-core/net/nimble/host/services/ans"
+    - "@apache-mynewt-core/net/nimble/host/services/gap"
+    - "@apache-mynewt-core/net/nimble/host/services/gatt"
+    - "@apache-mynewt-core/net/nimble/host/store/ram"
+    - "@apache-mynewt-core/net/nimble/transport/ram"
+    - "@apache-mynewt-core/sys/console/full"
+    - "@apache-mynewt-core/sys/log/full"
+    - "@apache-mynewt-core/sys/stats/full"
+    - "@apache-mynewt-core/sys/sysinit"
+    - "@apache-mynewt-core/sys/id"
+```
+
+Great! We have our very own app so let's make sure we have all of our targets set
+correctly:
+
+```hl_lines="3 8"
+$ newt target create nrf52_adc
+$ newt target set nrf52_adc app=apps/nrf52_adc
+Target targets/nrf52_adc successfully set target.app to apps/nrf52_adc
+$ newt target set nrf52_adc bsp=@apache-mynewt-core/hw/bsp/nrf52dk
+$ newt target set nrf52_adc build_profile=debug
+
+$ newt target create nrf52_boot
+$ newt target set nrf52_boot app=@apache-mynewt-core/apps/boot
+$ newt target set nrf52_boot bsp=@apache-mynewt-core/hw/bsp/nrf52dk
+$ newt target set nrf52_boot build_profile=optimized
+
+$ newt target show 
+targets/nrf52_adc
+    app=apps/nrf52_adc
+    bsp=@apache-mynewt-core/hw/bsp/nrf52dk
+    build_profile=debug
+targets/nrf52_boot
+    app=@apache-mynewt-core/apps/boot
+    bsp=@apache-mynewt-core/hw/bsp/nrf52dk
+    build_profile=optimized
+```
+
+<font color="#F2853F">
+Note: If you've already built and installed a bootloader for your NRF52dk then you do
+not need to create a target for it here, or build and load it as below. </font>
+<br>
+
+### Build the target executables 
+
+```
+$ newt build nrf52_boot
+...
+Compiling boot.c
+Archiving boot.a
+Linking boot.elf
+App successfully built: ~/dev/myadc/bin/nrf52_boot/apps/boot/boot.elf
+```
+```
+$ newt build nrf52_adc
+...
+Compiling main.c
+Archiving nrf52_adc.a
+Linking nrf52_adc.elf
+App successfully built: ~/dev/myadc/bin/nrf52_adc/apps/nrf52_adc/nrf52_adc.elf
+```
+
+<br>
+
+### Sign and create the nrf52_adc application image 
+
+You must sign and version your application image to download it using newt to the board. 
+Use the newt create-image command to perform this action. You may assign an arbitrary 
+version (e.g. 1.0.0) to the image.
+
+```
+$ newt create-image nrf52_adc 1.0.0
+App image successfully generated: ~/dev/myadc/bin/nrf52_adc/apps/nrf52_adc/nrf52_adc.img
+Build manifest: ~/dev/myadc/bin/nrf52_adc/apps/nrf52_adc/manifest.json
+```
+
+<br>
+
+### Connect the board
+
+Connect the evaluation board via micro-USB to your PC via USB cable.
+        
+<br>
+
+### Download to the target
+
+Download the bootloader first and then the nrf52_adc executable to the target platform. 
+Don't forget to reset the board if you don't see the LED blinking right away!
+
+```
+$ newt load nrf52_boot
+$ newt load nrf52_adc
+```
+
+<br>
+
+**Note:** If you want to erase the flash and load the image again, you can use JLinkExe to issue an `erase` command.
+
+```
+$ JLinkExe -device nRF52 -speed 4000 -if SWD
+SEGGER J-Link Commander V5.12c (Compiled Apr 21 2016 16:05:51)
+DLL version V5.12c, compiled Apr 21 2016 16:05:45
+
+Connecting to J-Link via USB...O.K.
+Firmware: J-Link OB-SAM3U128-V2-NordicSemi compiled Mar 15 2016 18:03:17
+Hardware version: V1.00
+S/N: 682863966
+VTref = 3.300V
+
+
+Type "connect" to establish a target connection, '?' for help
+J-Link>erase
+Cortex-M4 identified.
+Erasing device (0;?i?)...
+Comparing flash   [100%] Done.
+Erasing flash     [100%] Done.
+Verifying flash   [100%] Done.
+J-Link: Flash download: Total time needed: 0.363s (Prepare: 0.093s, Compare: 0.000s, Erase: 0.262s, Program: 0.000s, Verify: 0.000s, Restore: 0.008s)
+Erasing done.
+J-Link>exit
+$
+```
+<br>
+
+So you have a BLE app, but really all you've done is change the name of the **bleprph** app to **nrf52_adc** and load that.
+Not all that impressive, and it certainly won't read an Analog Sensor right now. So let's do that next. In order to 
+read an ADC sensor, and since the ADC package is in an external, licensed, repository, we'll create a driver for it
+here in our app that will leverage the existing driver in the external repository. It adds another layer of 
+indirection, but it will also give us a look at building our own driver, so we'll do it this way. 
+
+<br>
+
+### Building a Driver
+
+The first thing to do is to create the directory structure for your driver:
+
+```no-highlight
+[user@IsMyLaptop:~/src/air_quality]$ mkdir -p libs/my_drivers/myadc/include/myadc
+[user@IsMyLaptop:~/src/air_quality]$ mkdir -p libs/my_drivers/myadc/src
+```
+
+Now you can add the files you need. You'll need a pkg.yml to describe the driver, and then header stub followed by source stub.
+
+```no-highlight
+[user@IsMyLaptop:~/src/air_quality]$ cat libs/my_drivers/myadc/pkg.yml
+```
+
+```c
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+# 
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+pkg.name: libs/my_drivers/myadc
+pkg.deps:
+    - "@apache-mynewt-core/hw/hal"
+    - "@mynewt_nordic/hw/drivers/adc/adc_nrf52"
+```
+
+First, let's create the required header file `myadc.h` in the includes directory i.e. `libs/my_drivers/myadc/include/myadc/myadc.h`.
+It's a pretty straightforward header file, since we only need to do 2 things:
+
+* Initialize the ADC device
+* Read ADC Values
+
+
+```c
+#ifndef _NRF52_ADC_H_
+#define _NRF52_ADC_H_
+
+void * adc_init(void);
+int adc_read(void *buffer, int buffer_len);
+
+#endif /* _NRF52_ADC_H_ */
+
+```
+
+Next we'll need a corresponding source file `myadc.c` in the src directory. This is where
+we'll implement the specifics of the driver:
+
+```c
+
+#include <assert.h>
+#include <os/os.h>
+/* ADC */
+#include "myadc/myadc.h"
+#include "nrf.h"
+#include "app_util_platform.h"
+#include "app_error.h"
+#include <adc/adc.h>
+#include <adc_nrf52/adc_nrf52.h>
+#include "nrf_drv_saadc.h"
+
+
+#define ADC_NUMBER_SAMPLES (2)
+#define ADC_NUMBER_CHANNELS (1)
+
+nrf_drv_saadc_config_t adc_config = NRF_DRV_SAADC_DEFAULT_CONFIG;
+
+struct adc_dev *adc;
+uint8_t *sample_buffer1;
+uint8_t *sample_buffer2;
+
+static struct adc_dev os_bsp_adc0;
+static nrf_drv_saadc_config_t os_bsp_adc0_config = {
+    .resolution         = MYNEWT_VAL(ADC_0_RESOLUTION),
+    .oversample         = MYNEWT_VAL(ADC_0_OVERSAMPLE),
+    .interrupt_priority = MYNEWT_VAL(ADC_0_INTERRUPT_PRIORITY),
+};
+void *
+adc_init(void)
+{
+    int rc = 0;
+    
+    rc = os_dev_create((struct os_dev *) &os_bsp_adc0, "adc0",
+            OS_DEV_INIT_KERNEL, OS_DEV_INIT_PRIO_DEFAULT,
+            nrf52_adc_dev_init, &os_bsp_adc0_config);
+    assert(rc == 0);
+    nrf_saadc_channel_config_t cc = NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN1);
+    cc.gain = NRF_SAADC_GAIN1_6;
+    cc.reference = NRF_SAADC_REFERENCE_INTERNAL;
+    adc = (struct adc_dev *) os_dev_open("adc0", 0, &adc_config);
+    assert(adc != NULL);
+    adc_chan_config(adc, 0, &cc);
+    sample_buffer1 = malloc(adc_buf_size(adc, ADC_NUMBER_CHANNELS, ADC_NUMBER_SAMPLES));
+    sample_buffer2 = malloc(adc_buf_size(adc, ADC_NUMBER_CHANNELS, ADC_NUMBER_SAMPLES));
+    memset(sample_buffer1, 0, adc_buf_size(adc, ADC_NUMBER_CHANNELS, ADC_NUMBER_SAMPLES));
+    memset(sample_buffer2, 0, adc_buf_size(adc, ADC_NUMBER_CHANNELS, ADC_NUMBER_SAMPLES));
+    adc_buf_set(adc, sample_buffer1, sample_buffer2,
+        adc_buf_size(adc, ADC_NUMBER_CHANNELS, ADC_NUMBER_SAMPLES));
+    return adc;
+}
+
+
+int
+adc_read(void *buffer, int buffer_len)
+{
+    int i;
+    int adc_result;
+    int my_result_mv = 0;
+    int rc;
+    for (i = 0; i < ADC_NUMBER_SAMPLES; i++) {
+        rc = adc_buf_read(adc, buffer, buffer_len, i, &adc_result);
+        if (rc != 0) {
+            goto err;
+        }
+        my_result_mv = adc_result_mv(adc, 0, adc_result);
+    }        
+    adc_buf_release(adc, buffer, buffer_len);
+    return my_result_mv;
+err:
+    return (rc);
+}
+```
+There's a lot going on in here, so let's walk through it step by step. 
+
+First, we define a default configuration, with the resolution, oversample and interrupt priority. You'll see
+that these are `MYNEWT_VAL` values, which means that we'll define them shortly in
+a `syscfg.yml` file to be passed to the compiler at build time. 
+
+```c
+static struct adc_dev os_bsp_adc0;
+static nrf_drv_saadc_config_t os_bsp_adc0_config = {
+    .resolution         = MYNEWT_VAL(ADC_0_RESOLUTION),
+    .oversample         = MYNEWT_VAL(ADC_0_OVERSAMPLE),
+    .interrupt_priority = MYNEWT_VAL(ADC_0_INTERRUPT_PRIORITY),
+};
+```
+
+Next, in `adc_init()` , we need to tell the OS to create the device.
+
+```c
+void *
+adc_init(void)
+{
+    int rc = 0;
+    
+    rc = os_dev_create((struct os_dev *) &os_bsp_adc0, "adc0",
+            OS_DEV_INIT_KERNEL, OS_DEV_INIT_PRIO_DEFAULT,
+            nrf52_adc_dev_init, &os_bsp_adc0_config);
+    assert(rc == 0);
+    nrf_saadc_channel_config_t cc = NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN1);
+    cc.gain = NRF_SAADC_GAIN1_6;
+    cc.reference = NRF_SAADC_REFERENCE_INTERNAL;
+    adc = (struct adc_dev *) os_dev_open("adc0", 0, &adc_config);
+    assert(adc != NULL);
+    adc_chan_config(adc, 0, &cc);
+    sample_buffer1 = malloc(adc_buf_size(adc, ADC_NUMBER_CHANNELS, ADC_NUMBER_SAMPLES));
+    sample_buffer2 = malloc(adc_buf_size(adc, ADC_NUMBER_CHANNELS, ADC_NUMBER_SAMPLES));
+    memset(sample_buffer1, 0, adc_buf_size(adc, ADC_NUMBER_CHANNELS, ADC_NUMBER_SAMPLES));
+    memset(sample_buffer2, 0, adc_buf_size(adc, ADC_NUMBER_CHANNELS, ADC_NUMBER_SAMPLES));
+    adc_buf_set(adc, sample_buffer1, sample_buffer2,
+        adc_buf_size(adc, ADC_NUMBER_CHANNELS, ADC_NUMBER_SAMPLES));
+    return adc;
+}
+
+```
+A few things need to be said about this part, as it is the most confusing. First, 
+we're using a **default** configuration for the ADC Channel via the `NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE`
+macro. The important part here is that we're actually using `AIN1`. I know what you're thinking, "But 
+we want ADC-0!" and that's true. The board is actually labelled 'A0, A1, A2' etc., and the actual pin 
+numbers are also listed on the board, which seems handy. At first. But it gets messy very quickly.
+
+If you try to use AIN0, and then go poke around in the registers while this is running, 
+
+```
+(gdb) p/x {NRF_SAADC_Type}0x40007000
+...
+ CH = {{
+      PSELP = 0x1,
+      PSELN = 0x0,
+      CONFIG = 0x20000,
+      LIMIT = 0x7fff8000
+    }, 
+```
+
+You'll see that the pin for channel 0 is set to 1, which corresponds to AIN0, but that's **NOT**
+the same as A0 -- pin P0.03, the one we're using. For that, you use AIN1, which would set the
+pin value to 2. Messy. Someone, somewhere, thought this made sense. 
+
+
+The only other thing to note here is that we're using the internal reference voltage, rather than
+setting our own. There's nothing wrong with that, but since we are, we'll have to crank up
+the gain a bit by using `NRF_SAADC_GAIN1_6`.
+
+Then, in `adc_read()` we will take readings, convert the raw readings to 
+a millivolt equivalent, and return the result. 
+
+```c
+int
+adc_read(void *buffer, int buffer_len)
+{
+    int i;
+    int adc_result;
+    int my_result_mv = 0;
+    int rc;
+    for (i = 0; i < ADC_NUMBER_SAMPLES; i++) {
+        rc = adc_buf_read(adc, buffer, buffer_len, i, &adc_result);
+        if (rc != 0) {
+            goto err;
+        }
+        my_result_mv = adc_result_mv(adc, 0, adc_result);
+    }        
+    adc_buf_release(adc, buffer, buffer_len);
+    return my_result_mv;
+err:
+    return (rc);
+}
+```
+
+Finally, we'll need some settings for our driver, as mentioned earlier. In the `myadc` directory
+you'll need to add a `syscfg.yml` file:
+
+```no-highlight
+# Package: libs/my_driver/myadc
+
+syscfg.defs:
+    ADC_0:
+        description: 'TBD'
+        value:  1
+    ADC_0_RESOLUTION:
+        description: 'TBD'
+        value: 'SAADC_CONFIG_RESOLUTION'
+    ADC_0_OVERSAMPLE:
+        description: 'TBD'
+        value: 'SAADC_CONFIG_OVERSAMPLE'
+    ADC_0_INTERRUPT_PRIORITY:
+        description: 'TBD'
+        value: 'SAADC_CONFIG_IRQ_PRIORITY'
+```
+
+Once that's all done, you should have a working ADC Driver for your NRF52DK board. The last step in getting the driver set up is to include it in the package dependency defined by `pkg.deps` in the `pkg.yml` file of your app. Add it in `apps/nrf52_adc/pkg.yml` as shown by the highlighted line below.
+
+```hl_lines="29"
+# Licensed to the Apache Software Foundation (ASF) under one
+# <snip>
+
+pkg.name: apps/nrf52_adc
+pkg.type: app
+pkg.description: Simple BLE peripheral application for ADC sensor.
+pkg.author: "Apache Mynewt <de...@mynewt.incubator.apache.org>"
+pkg.homepage: "http://mynewt.apache.org/"
+pkg.keywords:
+
+pkg.deps: 
+    - "@apache-mynewt-core/boot/split"
+    - "@apache-mynewt-core/kernel/os"
+    - "@apache-mynewt-core/mgmt/imgmgr"
+    - "@apache-mynewt-core/mgmt/newtmgr"
+    - "@apache-mynewt-core/mgmt/newtmgr/transport/ble"
+    - "@apache-mynewt-core/net/nimble/controller"
+    - "@apache-mynewt-core/net/nimble/host"
+    - "@apache-mynewt-core/net/nimble/host/services/ans"
+    - "@apache-mynewt-core/net/nimble/host/services/gap"
+    - "@apache-mynewt-core/net/nimble/host/services/gatt"
+    - "@apache-mynewt-core/net/nimble/host/store/ram"
+    - "@apache-mynewt-core/net/nimble/transport/ram"
+    - "@apache-mynewt-core/sys/console/full"
+    - "@apache-mynewt-core/sys/log/full"
+    - "@apache-mynewt-core/sys/stats/full"
+    - "@apache-mynewt-core/sys/sysinit"
+    - "@apache-mynewt-core/sys/id"
+    - libs/my_drivers/myadc
+```
+
+
+<br>
+
+### Creating the ADC Task
+
+Now that the driver is done, we'll need to add calls to the main app's `main.c` file, as well
+as a few other things. First, we'll need to update the includes, and add a task for our ADC
+sampling.
+
+
+```c
+#include "myadc/myadc.h"
+...
+/* ADC Task settings */
+#define ADC_TASK_PRIO           5
+#define ADC_STACK_SIZE          (OS_STACK_ALIGN(336))
+struct os_eventq adc_evq;
+struct os_task adc_task;
+bssnz_t os_stack_t adc_stack[ADC_STACK_SIZE];
+```
+
+Next we'll need  o initialize the task `event_q` so we'll add the highlighted code to `main()` as shown below:
+
+```c hl_lines="7 8 9 10 11 12 13 14 15"
+    /* Set the default device name. */
+    rc = ble_svc_gap_device_name_set("nimble-adc");
+    assert(rc == 0);
+    
+    conf_load();
+    
+    /* Initialize adc sensor task eventq */
+    os_eventq_init(&adc_evq);
+
+    /* Create the ADC reader task.  
+     * All sensor operations are performed in this task.
+     */
+    os_task_init(&adc_task, "sensor", adc_task_handler,
+            NULL, ADC_TASK_PRIO, OS_WAIT_FOREVER,
+            adc_stack, ADC_STACK_SIZE);
+```
+We'll need that `adc_task_handler()` function to exist, and that's where we'll initialize the ADC Device
+and set the event handler. In the task's while() loop, we'll just make a call to `adc_sample()` to cause
+the ADC driver to sample the adc device.
+
+```c
+/**
+ * Event loop for the sensor task.
+ */
+static void
+adc_task_handler(void *unused)
+{
+    struct adc_dev *adc;
+    int rc;
+    /* ADC init */
+    adc = adc_init();
+    rc = adc_event_handler_set(adc, adc_read_event, (void *) NULL);
+    assert(rc == 0);
+    
+    while (1) {
+        adc_sample(adc);
+        /* Wait 2 second */
+        os_time_delay(OS_TICKS_PER_SEC * 2);
+    }
+}
+```
+
+Above the `adc_task_handler`, add code to handle the `adc_read_event()` calls:
+
+```c
+int
+adc_read_event(struct adc_dev *dev, void *arg, uint8_t etype,
+        void *buffer, int buffer_len)
+{
+    int value;
+    uint16_t chr_val_handle;
+    int rc;
+
+    value = adc_read(buffer, buffer_len);
+    if (value >= 0) {
+        console_printf("Got %d\n", value);
+    } else {
+        console_printf("Error while reading: %d\n", value);
+        goto err;
+    }
+    gatt_adc_val = value;
+    rc = ble_gatts_find_chr(&gatt_svr_svc_adc_uuid.u, BLE_UUID16_DECLARE(ADC_SNS_VAL), NULL, &chr_val_handle);
+    assert(rc == 0);
+    ble_gatts_chr_updated(chr_val_handle);
+    return (0);
+err:
+    return (rc);
+} 
+```
+This is where we actually read the ADC value and then update the BLE Characteristic for that value. 
+
+But wait, we haven't defined those BLE services and characteristics yet! Right, so don't try to build and run this
+app just yet or it will surely fail. Instead, move on to the next section and get all of those services 
+defined.
+
+<br>
+
+### Building the BLE Services
+
+If the nrf52_adc app is going to be a Bluetooth-enabled sensor app that will allow you to read the value of the eTape Water Level Sensor
+via Bluetooth we'll need to actually define those Services and Characteristics.
+
+As with the [ble peripheral](bleprph/bleprph-app.md) app, we will advertise a couple of values from our app. The first is
+not strictly necessary, but it will help us build an iOS app later. We've defined a service and the characteristics in
+that service in `bleadc.h` in the `apps/nrf52_adc/src/` directory as follows:
+
+```c
+/* Sensor Data */
+/* e761d2af-1c15-4fa7-af80-b5729002b340 */
+static const ble_uuid128_t gatt_svr_svc_adc_uuid =
+        BLE_UUID128_INIT(0x40, 0xb3, 0x20, 0x90, 0x72, 0xb5, 0x80, 0xaf,
+                         0xa7, 0x4f, 0x15, 0x1c, 0xaf, 0xd2, 0x61, 0xe7);
+#define ADC_SNS_TYPE          0xDEAD
+#define ADC_SNS_STRING "eTape Liquid Level Sensor"
+#define ADC_SNS_VAL           0xBEAD
+extern uint16_t gatt_adc_val; 
+```
+
+The first is the UUID of the service, followed by the 2 characteristics we are going to offer.
+The first characteristic is going to advertise the *type* of sensor we are advertising, and
+it will be a read-only characteristic. The second characteristic will be the sensor value
+itself, and we will allow connected devices to 'subscribe' to it in order to get 
+constantly-updated values.
+
+
+**Note:** You can choose any valid Characteristic UUIDs to go here. We're using these values
+for illustrative purposes only.
+
+The value that we'll be updating is also defined here as `gatt_adc_val`.
+
+If we then go look at `gatt_srv.c` we can see the structure of the service and
+characteristic offering that we set up:
+
+```c hl_lines="21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37"
+static const struct ble_gatt_svc_def gatt_svr_svcs[] = {
+    {
+        /*** Service: Security test. */
+        .type = BLE_GATT_SVC_TYPE_PRIMARY,
+        .uuid = &gatt_svr_svc_sec_test_uuid.u,
+        .characteristics = (struct ble_gatt_chr_def[]) { {
+            /*** Characteristic: Random number generator. */
+            .uuid = &gatt_svr_chr_sec_test_rand_uuid.u,
+            .access_cb = gatt_svr_chr_access_sec_test,
+            .flags = BLE_GATT_CHR_F_READ | BLE_GATT_CHR_F_READ_ENC,
+        }, {
+            /*** Characteristic: Static value. */
+            .uuid = &gatt_svr_chr_sec_test_static_uuid.u,
+            .access_cb = gatt_svr_chr_access_sec_test,
+            .flags = BLE_GATT_CHR_F_READ |
+                     BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_WRITE_ENC,
+        }, {
+            0, /* No more characteristics in this service. */
+        } },
+    },
+    {
+        /*** ADC Level Notification Service. */
+        .type = BLE_GATT_SVC_TYPE_PRIMARY,
+        .uuid = &gatt_svr_svc_adc_uuid.u,
+        .characteristics = (struct ble_gatt_chr_def[]) { {
+            .uuid = BLE_UUID16_DECLARE(ADC_SNS_TYPE),
+            .access_cb = gatt_svr_sns_access,
+            .flags = BLE_GATT_CHR_F_READ,
+        }, {
+            .uuid = BLE_UUID16_DECLARE(ADC_SNS_VAL),
+            .access_cb = gatt_svr_sns_access,
+            .flags = BLE_GATT_CHR_F_NOTIFY,
+        }, {
+            0, /* No more characteristics in this service. */
+        } },
+    },
+
+    {
+        0, /* No more services. */
+    },
+};
+```
+
+You should recognize the first services from the [BLE Peripheral](bleprph/bleprph-intro.md)
+tutorial earlier. We're just adding another Service, with 2 new Characteristics, to 
+that application.
+
+We'll need to fill in the function that will be called for this service, `gatt_srv_sns_access`
+next so that the service knows what to do.
+
+```c
+static int
+gatt_svr_sns_access(uint16_t conn_handle, uint16_t attr_handle,
+                          struct ble_gatt_access_ctxt *ctxt,
+                          void *arg)
+{
+    uint16_t uuid16;
+    int rc;
+
+    uuid16 = ble_uuid_u16(ctxt->chr->uuid);
+
+    switch (uuid16) {
+    case ADC_SNS_TYPE:
+        assert(ctxt->op == BLE_GATT_ACCESS_OP_READ_CHR);
+        rc = os_mbuf_append(ctxt->om, ADC_SNS_STRING, sizeof ADC_SNS_STRING);
+        BLEPRPH_LOG(INFO, "ADC SENSOR TYPE READ: %s\n", ADC_SNS_STRING);
+        return rc == 0 ? 0 : BLE_ATT_ERR_INSUFFICIENT_RES;
+
+    case ADC_SNS_VAL:
+        if (ctxt->op == BLE_GATT_ACCESS_OP_WRITE_CHR) {
+            rc = gatt_svr_chr_write(ctxt->om, 0,
+                                    sizeof gatt_adc_val,
+                                    &gatt_adc_val,
+                                    NULL);
+            return rc;
+        } else if (ctxt->op == BLE_GATT_ACCESS_OP_READ_CHR) {
+            rc = os_mbuf_append(ctxt->om, &gatt_adc_val,
+                                sizeof gatt_adc_val);
+            return rc == 0 ? 0 : BLE_ATT_ERR_INSUFFICIENT_RES;
+        }
+
+    default:
+        assert(0);
+        return BLE_ATT_ERR_UNLIKELY;
+    }
+}
+
+```
+
+You can see that when request is for the `ADC_SNS_TYPE`, we return the
+Sensor Type we defined earlier. If the request if for `ADC_SNS_VAL` we'll return the
+`gatt_adc_val` value. 
+
+Don't forget to include the `bleadc.h` include file at the top of the `gatt_svr.c` file!
+
+```hl_lines="8"
+#include <assert.h>
+#include <stdio.h>
+#include <string.h>
+#include "bsp/bsp.h"
+#include "host/ble_hs.h"
+#include "host/ble_uuid.h"
+#include "bleprph.h"
+#include "bleadc.h"
+```
+
+If you build, load and run this application now, you will see all those Services and Characteristics
+advertised, and you will even be able to read the "Sensor Type" String via the ADC_SNS_TYPE
+Characteristic.
+
+<br>
+
+
+### Adding the eTape Water Sensor
+
+Now that we have a fully functioning BLE App that we can subscribe to sensor
+values from, it's time to actually wire up the sensor!
+
+As previously mentioned, we're going to be using an eTape Water Level Sensor. You can 
+get one from [Adafruit](https://www.adafruit.com/products/1786). 
+
+We're going to use the sensor as a resistive sensor, and the setup is very simple. 
+I'll be using a 'breadboard` to put this all together for illustrative purposes. 
+First, attach a jumper-wire from Vdd on the board to the breadboard.
+Next, attach a jumper wire from pin P0.03 on the board to the breadboard. This will be
+our ADC-in. The sensor should have come with a 560 ohm resistor, so plug that
+into the board between Vdd and ADC-in holes. Finally, attach a jumper from
+GND on the board to your breadboard. At this point, your breadboard should look
+like this:
+
+![Bread Board Setup](pics/breadboard.png)
+
+Now attach one of the middle 2 leads from the sensor to ground on the breadboard and 
+the other middle lead to the ADC-in on the breadboard. Your breadboard should now look
+like this:
+
+![Bread Board Final](pics/adc-demo-1.png)
+
+And your eTape Sensor should look like this (at least if you have it mounted in a
+graduated cylinder as I do).
+
+![eTape Sensor Setup](pics/adc-demo-2.png)
+
+That concludes the hardware portion. Easy!
+
+At this point you should be able to build, create-image and load your application and see it properly 
+sending readings. 
+
+<br>
+
+
+### Conclusion
+
+Congratulations, you've now completed both a hardware project and a software project by connecting a
+sensor to your device and using Mynewt to read data from that sensor and send it via Bluetooth
+to a connected device. That's no small feat!
+
+If you see anything missing or want to send us feedback, please do so by signing up for 
+appropriate mailing lists on our [Community Page](../../community.md).
+
+Keep on hacking and sensing!
+
+<br>
+
+### Note
+
+If you're wondering how to actually view these sensor readings via Bluetooth, you have a couple of
+options. On Mac OS or iOS you can download the [LightBlue app](https://itunes.apple.com/us/app/lightblue-explorer-bluetooth/id557428110?mt=8).
+This app lets you connect to, and interrogate, BLE devices like the one you just built. 
+
+If you used the BLE Service and Characteristic UUIDs used in this tutorial, you can also download
+and use a Mac OS [MyNewt Sensor Reader App](https://dragonflyiot.com/MyNewtSensorReader.zip) (Zip Archive) that allows 
+you to graph your data, etc. An iOS version is in Beta testing and should be available soon.
+
+![My Newt Sensor Reader](pics/MyNewtSensorReader006.jpg)
+
+Enjoy!
+
+
+
+

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-site/blob/55a2604c/docs/os/tutorials/pics/MyNewtSensorReader006.jpg
----------------------------------------------------------------------
diff --git a/docs/os/tutorials/pics/MyNewtSensorReader006.jpg b/docs/os/tutorials/pics/MyNewtSensorReader006.jpg
new file mode 100644
index 0000000..c15d69d
Binary files /dev/null and b/docs/os/tutorials/pics/MyNewtSensorReader006.jpg differ

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-site/blob/55a2604c/docs/os/tutorials/pics/adc-demo-1.png
----------------------------------------------------------------------
diff --git a/docs/os/tutorials/pics/adc-demo-1.png b/docs/os/tutorials/pics/adc-demo-1.png
new file mode 100644
index 0000000..6e5de58
Binary files /dev/null and b/docs/os/tutorials/pics/adc-demo-1.png differ

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-site/blob/55a2604c/docs/os/tutorials/pics/adc-demo-2.png
----------------------------------------------------------------------
diff --git a/docs/os/tutorials/pics/adc-demo-2.png b/docs/os/tutorials/pics/adc-demo-2.png
new file mode 100644
index 0000000..be2cce7
Binary files /dev/null and b/docs/os/tutorials/pics/adc-demo-2.png differ

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-site/blob/55a2604c/docs/os/tutorials/pics/breadboard.png
----------------------------------------------------------------------
diff --git a/docs/os/tutorials/pics/breadboard.png b/docs/os/tutorials/pics/breadboard.png
new file mode 100644
index 0000000..39a2b9d
Binary files /dev/null and b/docs/os/tutorials/pics/breadboard.png differ


[3/3] incubator-mynewt-site git commit: 1.0.0-b2 release announcement added

Posted by ad...@apache.org.
1.0.0-b2 release announcement added


Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-site/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-site/commit/6c1d0e73
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-site/tree/6c1d0e73
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-site/diff/6c1d0e73

Branch: refs/heads/master
Commit: 6c1d0e73e4f04a3c36d46b3810ec8116aa7d25d7
Parents: 311f005
Author: aditihilbert <ad...@runtime.io>
Authored: Fri Feb 24 15:00:32 2017 -0800
Committer: aditihilbert <ad...@runtime.io>
Committed: Fri Feb 24 15:00:32 2017 -0800

----------------------------------------------------------------------
 custom-theme/main-banner.html | 2 +-
 docs/download.md              | 7 ++++---
 2 files changed, 5 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-site/blob/6c1d0e73/custom-theme/main-banner.html
----------------------------------------------------------------------
diff --git a/custom-theme/main-banner.html b/custom-theme/main-banner.html
index 6ea0f69..efa3cbd 100644
--- a/custom-theme/main-banner.html
+++ b/custom-theme/main-banner.html
@@ -8,7 +8,7 @@
         </div>
         <div class="news-cell">
             <div class="well">
-                <h4>Latest News:</h4> <a href="/download">Apache Mynewt 1.0.0-b1</a> released (Dec 13, 2016)
+                <h4>Latest News:</h4> <a href="/download">Apache Mynewt 1.0.0-b2</a> released (Feb 15, 2017)
             </div>
         </div>
     </div>

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-site/blob/6c1d0e73/docs/download.md
----------------------------------------------------------------------
diff --git a/docs/download.md b/docs/download.md
index 7eaac74..738ed5f 100644
--- a/docs/download.md
+++ b/docs/download.md
@@ -1,8 +1,8 @@
 ### Latest Apache Mynewt OS Release
 
-* Release Version:Apache Mynewt: 1.0.0-b1-incubating
-* Release Date: Dec 13, 2016
-* [Release Notes](https://cwiki.apache.org/confluence/display/MYNEWT/RN-1.0.0-b1-incubating) 
+* Release Version: Apache Mynewt 1.0.0-b2-incubating
+* Release Date: Feb 15, 2017
+* [Release Notes](https://cwiki.apache.org/confluence/display/MYNEWT/RN-1.0.0-b2-incubating) 
 
 
 #### Fresh install
@@ -56,5 +56,6 @@ For general information on using Git at Apache, go to https://git-wip-us.apache.
 * Apache Mynewt 0.8.0-incubating, [Release Notes](https://cwiki.apache.org/confluence/display/MYNEWT/RN-0.8.0-incubating)
 * Apache Mynewt 0.8.0-b2-incubating, [Release Notes](https://cwiki.apache.org/confluence/display/MYNEWT/RN-0.8.0-b2-incubating)
 * Apache Mynewt 0.9.0-incubating, [Release Notes](https://cwiki.apache.org/confluence/display/MYNEWT/RN-0.9.0-incubating)
+* Apache Mynewt 1.0.0-b1-incubating, [Release Notes](https://cwiki.apache.org/confluence/display/MYNEWT/RN-1.0.0-b1-incubating)
 <br>
 <br>


[2/3] incubator-mynewt-site git commit: Event queue doc update. This closes #153. This closes #154.

Posted by ad...@apache.org.
Event queue doc update. This closes #153. This closes #154.


Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-site/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-site/commit/311f005d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-site/tree/311f005d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-site/diff/311f005d

Branch: refs/heads/master
Commit: 311f005d54473f4453d345fa964da5cb7d8f19c7
Parents: 55a2604
Author: aditihilbert <ad...@runtime.io>
Authored: Mon Feb 20 08:14:10 2017 -0800
Committer: aditihilbert <ad...@runtime.io>
Committed: Mon Feb 20 08:29:45 2017 -0800

----------------------------------------------------------------------
 .../core_os/event_queue/os_eventq_designate.md  | 44 ++++++++++++++++++++
 docs/os/core_os/event_queue/os_eventq_run.md    | 40 ++++++++++++++++++
 2 files changed, 84 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-site/blob/311f005d/docs/os/core_os/event_queue/os_eventq_designate.md
----------------------------------------------------------------------
diff --git a/docs/os/core_os/event_queue/os_eventq_designate.md b/docs/os/core_os/event_queue/os_eventq_designate.md
new file mode 100644
index 0000000..901231e
--- /dev/null
+++ b/docs/os/core_os/event_queue/os_eventq_designate.md
@@ -0,0 +1,44 @@
+## <font color="F2853F" style="font-size:24pt"> os_eventq_designate</font>
+
+```c
+   void
+    os_eventq_designate(struct os_eventq **cur_evq, struct os_eventq *new_evq,  struct os_event *start_ev)
+```
+ 
+Reassigns a package's current event queue pointer to point to a new event queue. If a startup event 
+is specified, the event is added to the new event queue and removed from the current event queue.
+
+
+#### Arguments
+
+| Arguments | Description |
+|-----------|-------------|
+| `cur_evq`|  Current event queue pointer to reassign |
+| `new_evq` | New event queue to use for the package |
+| `start_ev` | Start event to add to the new event queue |
+
+#### Returned values
+
+None
+
+#### Notes
+
+
+#### Example
+
+<Add text to set up the context for the example here>
+
+This example shows the `mgmt_evq_set()` function that the `mgmt/newtmgr` package implements. The function
+allows an application to specify an event queue for `newtmgr` to use. The `mgmt_evq_set()` function calls the `os_eventq_designate()` function to reassign the `nmgr_evq` to the event queue that the application specifies. 
+
+
+```c
+void
+mgmt_evq_set(struct os_eventq *evq)
+{
+    os_eventq_designate(&nmgr_evq, evq, NULL);
+}
+
+
+```
+

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-site/blob/311f005d/docs/os/core_os/event_queue/os_eventq_run.md
----------------------------------------------------------------------
diff --git a/docs/os/core_os/event_queue/os_eventq_run.md b/docs/os/core_os/event_queue/os_eventq_run.md
new file mode 100644
index 0000000..52a754c
--- /dev/null
+++ b/docs/os/core_os/event_queue/os_eventq_run.md
@@ -0,0 +1,40 @@
+## <font color="F2853F" style="font-size:24pt"> os_eventq_run</font>
+
+```c
+   void
+    os_eventq_run(struct os_eventq *evq)
+```
+Wrapper function that calls the `os_eventq_get()` function to dequeue the event from the head of the event queue and then calls the callback function for the event.
+
+#### Arguments
+
+| Arguments | Description |
+|-----------|-------------|
+| `evq`|  Event queue to dequeue the event from |
+
+#### Returned values
+
+None
+
+#### Notes
+
+
+#### Example
+
+<Add text to set up the context for the example here>
+This example shows an application `main()` that calls the `os_eventq_run()` function to process events from the OS default event queue in an infinite loop.
+
+```c
+int
+main(int argc, char **argv)
+{
+
+     sysinit();
+       ...
+
+     while (1) {
+        os_eventq_run(os_eventq_dflt_get());
+     }
+}
+```
+