[roll third_party/pigweed] pw_bluetooth: Add IoCapabilityRequestEvent Emboss definition

Test: pw presubmit --step gn_emboss_nanopb_build
Original-Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/168353

https://pigweed.googlesource.com/pigweed/pigweed
third_party/pigweed Rolled-Commits: 8fe3c02b69f8e69..155b55c593ad161
Roller-URL: https://ci.chromium.org/b/8771386172180033809
GitWatcher: ignore
CQ-Do-Not-Cancel-Tryjobs: true
Change-Id: I89304b94698558e660147571c4c5c91ae9718841
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/sample_project/+/168931
Bot-Commit: Pigweed Roller <pigweed-roller@pigweed-service-accounts.iam.gserviceaccount.com>
Commit-Queue: Pigweed Roller <pigweed-roller@pigweed-service-accounts.iam.gserviceaccount.com>
1 file changed
tree: 1aaeb7d7f2d5d4af5590244de7b60b31267c11ff
  1. build_overrides/
  2. docs/
  3. examples/
  4. images/
  5. infra/
  6. source/
  7. targets/
  8. third_party/
  9. tools/
  10. .gitattributes
  11. .gitignore
  12. .gitmodules
  13. .gn
  14. activate.bat
  15. banner.txt
  16. bootstrap.bat
  17. bootstrap.sh
  18. BUILD.gn
  19. BUILDCONFIG.gn
  20. LICENSE
  21. navbar.md
  22. OWNERS
  23. pigweed.json
  24. pyproject.toml
  25. README.md
README.md

Pigweed Sample Project

This repository outlines the recommended way of using Pigweed in a new or existing project. Feel free to fork this repository, or read it as a reference.

For more information see the Pigweed Getting started guide.

Check back for more complex examples and features coming soon!

Repository setup

Clone this repo with --recursive to get all required submodules.

git clone --recursive https://pigweed.googlesource.com/pigweed/sample_project

This will pull the Pigweed source repository into third_party/pigweed. If you already cloned but forgot to --recursive run git submodule update --init to pull all submodules.

Environment Setup

After cloning the build tools will need to be installed with the bootstrap scripts. This is only required after the initial clone or updating Pigweed.

Windows

bootstrap.bat

Linux & Mac

source bootstrap.sh

bootstrap.bat and bootstrap.sh call the respective Pigweed bootstrap scripts. Feel free to modify them to set up your development environment for the first time.

After the initial bootstrap, use the activate scripts to setup your shell for development.

Windows

activate.bat

Linux & Mac

source activate.sh

Banner

Make the project yours with your own banner! Edit banner.txt as desired :-D.

Building

Generate the build files with gn gen out once, unless the build configuration has changed. Then, use ninja to build everything with ninja -C out.

WARNING: Unless your build directory (the out in gn gen out) is exactly one directory away from the project root directory (the sample_project repo root in this case), there will be issues finding source files while debugging and while generating coverage reports. This is due an issue in upstream LLVM reordering debug and coverage path mappings (tracked by b/278898014 and b/278906020). We recommend sticking to simple, single directory build directories for the time being.

The sample project examples have dependencies, each with some required build arguments. See the Arduino, and RPC sections for more setup information. The build arguments can be set with gn args out.

Pigweed's File System Watcher

Speed up iteration running pw watch on a new terminal window. This utility builds targets and runs tests when their files are modified. See the pw_watch documentation for more information.

Presubmits

Sample presubmit checks are included in tools/presubmit_checks.py. To install them run python tools/presubmit_checks.py --install. See the pw_presubmit module documentation for more information.

Sample Application

The sample application in source/main.cc uses the sample module simple_counter. Look at source/BUILD.gn and source/simple_counter/BUILD.gn to see how these are built respectively. The key part is in the root BUILD.gn, which creates the host target using the host toolchain. A toolchain is required for each target.

Build the project and run the application.

./out/host_clang_debug/obj/source/bin/hello_world

Sample Test

The simple_counter module has tests defined in source/simple_counter_tests.cc. Look at source/simple_counter/BUILD.gn for an example of how a test is defined. The root BUILD.gn groups all the host tests together.

Build the project and run the tests.

./out/host_clang_debug_tests/obj/source/simple_counter/test/simple_counter_test

Arduino Example

1. Install an Arduino Core

To build for Arduino boards you must install a core. At this time only the Teensyduino core is supported.

Check the Pigweed pw_arduino_build module documentation for detailed installation instructions. Cores should be installed into third_party/piwgweed/third_party/arduino.

Run this to install the Teensy core:

arduino_builder install-core --prefix ./third_party/pigweed/third_party/arduino/cores/ --core-name teensy

2. Build

To build for a Teensy 4.0 board run the following.

Linux & Mac

gn gen out --args='
  pw_arduino_build_CORE_PATH="//third_party/pigweed/third_party/arduino/cores"
  pw_arduino_build_CORE_NAME="teensy"
  pw_arduino_build_PACKAGE_NAME = "teensy/avr"
  pw_arduino_build_BOARD="teensy40"'
ninja -C out

Windows

Run gn gen out which will open a text editor. Paste in the following, save and close the editor.

pw_arduino_build_CORE_PATH="//third_party/pigweed/third_party/arduino/cores"
pw_arduino_build_CORE_NAME="teensy"
pw_arduino_build_PACKAGE_NAME = "teensy/avr"
pw_arduino_build_BOARD="teensy40"

Where pw_arduino_build_BOARD= is one of:

  • "teensy31" - Teensy 3.2 / 3.1
  • "teensy35" - Teensy 3.5
  • "teensy36" - Teensy 3.6
  • "teensy40" - Teensy 4.0
  • "teensy41" - Teensy 4.1

3. Run a Test

Manual Test

Tests can be manually flashed an run with the arduino_unit_test_runner and the .elf file.

arduino_unit_test_runner --verbose \
    --config-file out/arduino_debug/gen/arduino_builder_config.json \
    --upload-tool teensyloader \
    out/arduino_debug_tests/obj/source/simple_counter/test/simple_counter_test.elf

Single line:

arduino_unit_test_runner --verbose --config-file out/arduino_debug/gen/arduino_builder_config.json --upload-tool teensyloader out/arduino_debug_tests/obj/source/simple_counter/test/simple_counter_test.elf

Flash Only

A given binary can be flashed without checking for test pass or fail messages with the --flash-only option:

arduino_unit_test_runner --verbose \
  --config out/arduino_debug/gen/arduino_builder_config.json \
  --upload-tool teensyloader \
  --flash-only \
  out/arduino_debug_tests/obj/source/simple_counter/test/simple_counter_test.elf

Single line:

arduino_unit_test_runner --verbose --config out/arduino_debug/gen/arduino_builder_config.json --upload-tool teensyloader --flash-only out/arduino_debug_tests/obj/source/simple_counter/test/simple_counter_test.elf

Unit Test Server

If you would like to use the unit test server to automatically run your tests you must set the pw_arduino_use_test_server=true build arg and startup the test server. Then in a second window start the pw watch command.

  1. Start the test server in it's own terminal window.

    gn gen out --args='
      pw_arduino_build_CORE_PATH="//third_party/pigweed/third_party/arduino/cores"
      pw_arduino_build_CORE_NAME="teensy"
      pw_arduino_build_PACKAGE_NAME = "teensy/avr"
      pw_arduino_build_BOARD="teensy40"
      pw_arduino_use_test_server=true'
    arduino_test_server --verbose --config-file ./out/arduino_debug/gen/arduino_builder_config.json
    
  2. Start pw watch in a separate terminal.

    pw watch
    

For additional details check the Pigweed arduino_builder documentation in:

Tokenized Logging

Log entries in the sample app are tokenized to save binary space. The included tokens database, source/tokenizer_database.csv, is updated on each build. See the Pigweed pw_tokenizer for more information.

Optionally, the database can be created manually using the binary or the .elf file.

python -m pw_tokenizer.database create \
    --database source/tokenizer_database.csv \
    out/host_clang_debug/obj/source/bin/hello_world

Single line:

python -m pw_tokenizer.database create --database source/tokenizer_database.csv out/host_clang_debug/obj/source/bin/hello_world

Running the app shows log entries similiar to $kgjLdg==. These can be saved to a file and then detokenized.

./out/host_clang_debug/obj/source/bin/hello_world > log.txt
python -m pw_tokenizer.detokenize base64 source/tokenizer_database.csv -i log.txt

Or can be detokenized in realtime.

./out/host_clang_debug/obj/source/bin/hello_world | python \
    -m pw_tokenizer.detokenize base64 source/tokenizer_database.csv

RPC Example

The sample project uses nanopb for its pw_rpc dependency. The nanopb repo is conveniently included as a git submodule. This installation can be overridden following the instructions in third_party/pigweed/third_party/nanopb/BUILD.gn. Then set dir_pw_third_party_nanopb to the new installation location when building. For example:

gn gen out --args='dir_pw_third_party_nanopb="third_party/nanopb"'

The sample application registers the EchoService, which echoes any RPC message data sent to it. To test it out build for and flash the desired board, then run:

python third_party/pigweed/pw_hdlc/rpc_example/example_script.py --device /dev/ttyACM0 --baud 115200

At the time of writing, the example_script.py does not parse log statements if they are not framed in the HDLC protocol used by RPC. There is ongoing work on an RPC log service that will handle sending logs in HDLC frames to an RPC channel. In addition, the sample application uses tokenized logging, which means that logs need to be detokenized after the RPC HDLC frames are decoded on the host side. To do that flash the hello_word application and use two terminals to parse RPCs and detokenize logs respectively.

Terminal 1: receive RPCs.

source activate.sh
python -m pw_hdlc.rpc_console \
       -o logfile.txt \
       -d /dev/ttyACM0 \
       ./third_party/pigweed/pw_rpc/pw_rpc_protos/echo.proto

Test Echo RPC:

rpcs.pw.rpc.EchoService.Echo(msg="hola")

Terminal 2: decode the logfile.

source activate.sh
tail -f logfile.txt | python -m pw_tokenizer.detokenize \
    base64 source/tokenizer_database.csv