commit | f982ad739f3bf8be9a3f750b65d994f5cb6eba3a | [log] [tgz] |
---|---|---|
author | Anthony DiGirolamo <tonymd@google.com> | Thu Oct 29 17:43:19 2020 -0700 |
committer | CQ Bot Account <pigweed-scoped@luci-project-accounts.iam.gserviceaccount.com> | Fri Oct 30 00:47:26 2020 +0000 |
tree | f864e73e54e5f0a0341e0c021037029ed7060474 | |
parent | 33fd3ee94efe8d4c571f907b6efda5a69a477b1a [diff] |
Only build tokenizer database on linux Change-Id: I85cae1c5c27f5c77ce12ceb0b77f147eb16c4016 Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/sample_project/+/22922 Reviewed-by: Wyatt Hepler <hepler@google.com> Commit-Queue: Anthony DiGirolamo <tonymd@google.com>
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!
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.
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
Make the project yours with your own banner! Edit banner.txt
as desired :-D
.
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
.
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
.
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.
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.
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
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
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
NOTE: At this time Teensyduino 1.53 does not build with the c++17 standard which is required for Pigweed. There is an open pull request to fix this but in the meantime you will need to patch the core files. This will download a diff and patch the relevant files:
pushd ./third_party/pigweed/third_party/arduino/cores/teensy/hardware/teensy/avr/cores/ curl -O https://gist.githubusercontent.com/AnthonyDiGirolamo/9368d2879d9aec6be4118e72c2b0cf46/raw/teensy34_cpp17_patch.diff patch -p1 < teensy34_cpp17_patch.diff popd
source/arduino_example
Arduino.h
.source/arduino_example/BUILD.gn
source/main.cc
BUILD.gn
source/target/arduino
To build for a Teensy 3.1 board run the following.
gn gen out --args=' dir_pw_third_party_arduino="//third_party/pigweed/third_party/arduino" arduino_core_name="teensy" arduino_board="teensy40"' ninja -C out
Where arduino_board=
is one of:
"teensy41"
- Teensy 4.1"teensy40"
- Teensy 4.0"teensy36"
- Teensy 3.6"teensy35"
- Teensy 3.5"teensy31"
- Teensy 3.2 / 3.1Tests 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
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.
Start the test server in it's own terminal window.
gn gen out --args=' dir_pw_third_party_arduino="//third_party/pigweed/third_party/arduino" arduino_core_name="teensy" arduino_board="teensy40" pw_arduino_use_test_server=true' arduino_test_server --verbose \ --config-file ./out/arduino_debug/gen/arduino_builder_config.json
Start pw watch
with the arduino target
in a separate terminal.
pw watch out arduino
For additional details check the Pigweed arduino_builder
documentation in:
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
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
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_lite/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_lite.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