From 16b5c12a3cbd9f0d159f20e436006ad2b28dc08a Mon Sep 17 00:00:00 2001 From: Chris Gravel Date: Sat, 23 Apr 2022 19:50:43 -0700 Subject: [PATCH 1/3] Chef - Add RPC support for NRF Change-Id: I8e4e35e2aae656d8d2f228d63855c8eb75c1d791 --- examples/chef/chef.py | 10 +- examples/chef/nrfconnect/CMakeLists.txt | 162 ++++++++++++++++++++++-- examples/chef/nrfconnect/main.cpp | 16 ++- examples/chef/nrfconnect/rpc.overlay | 49 +++++++ examples/platform/nrfconnect/Rpc.cpp | 3 + 5 files changed, 226 insertions(+), 14 deletions(-) create mode 100644 examples/chef/nrfconnect/rpc.overlay diff --git a/examples/chef/chef.py b/examples/chef/chef.py index 6da1c9c582ae57..bd15613db67323 100755 --- a/examples/chef/chef.py +++ b/examples/chef/chef.py @@ -355,11 +355,13 @@ def main(argv): queueCommand("idf.py build") elif options.buildTarget == "nrfconnect": queueCommand(f"cd {paths['rootSampleFolder']}/nrfconnect") + nrf_build_cmd = "west build -b nrf52840dk_nrf52840" + nrf_build_options = [] if options.doClean: - # queueCommand(f"rm -rf {paths['rootSampleFolder']}/nrfconnect/build") - queueCommand(f"west build -b nrf52840dk_nrf52840 -p always") - else: - queueCommand(f"west build -b nrf52840dk_nrf52840") + nrf_build_options.append("-p always") + if options.doRPC: + nrf_build_options.append("-- -DOVERLAY_CONFIG=rpc.overlay") + queueCommand(nrf_build_cmd + " ".join(nrf_build_options)) elif options.buildTarget == "linux": queueCommand(f"cd {paths['rootSampleFolder']}/linux") queueCommand(f''' diff --git a/examples/chef/nrfconnect/CMakeLists.txt b/examples/chef/nrfconnect/CMakeLists.txt index 1cfbf5512c7ab2..322d130e92f743 100644 --- a/examples/chef/nrfconnect/CMakeLists.txt +++ b/examples/chef/nrfconnect/CMakeLists.txt @@ -17,7 +17,6 @@ cmake_minimum_required(VERSION 3.13.1) get_filename_component(CHIP_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/third_party/connectedhomeip REALPATH) get_filename_component(NRFCONNECT_COMMON ${CHIP_ROOT}/examples/platform/nrfconnect REALPATH) -get_filename_component(APP_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/.. REALPATH) get_filename_component(CHEF ${CMAKE_CURRENT_SOURCE_DIR}/../ REALPATH) include(${CHIP_ROOT}/config/nrfconnect/app/check-nrfconnect-version.cmake) @@ -39,12 +38,13 @@ set(mcuboot_KCONFIG_ROOT ${CHIP_ROOT}/config/nrfconnect/chip-module/Kconfig.mcub set(multiprotocol_rpmsg_KCONFIG_ROOT ${CHIP_ROOT}/config/nrfconnect/chip-module/Kconfig.multiprotocol_rpmsg.root) list(APPEND ZEPHYR_EXTRA_MODULES ${CHIP_ROOT}/config/nrfconnect/chip-module) -find_package(Zephyr HINTS $ENV{ZEPHYR_BASE}) if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/boards/${BOARD}.conf) list(APPEND CONF_FILE boards/${BOARD}.conf) endif() +find_package(Zephyr HINTS $ENV{ZEPHYR_BASE}) + project(chip-nrfconnect-chef-example) include(${CHIP_ROOT}/config/nrfconnect/app/enable-gnu-std.cmake) @@ -59,7 +59,7 @@ target_compile_options(app PRIVATE -Werror -Wno-error=maybe-uninitialized) target_include_directories(app PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/third_party/connectedhomeip/zzz_generated/app-common - ${APP_ROOT}/shell_common/include + ${CHEF}/shell_common/include ${GEN_DIR} ${CHEF} ${GEN_DIR}/../ @@ -68,13 +68,22 @@ target_include_directories(app PRIVATE ${NRFCONNECT_COMMON}/app/include ) +if (CONFIG_ENABLE_CHIP_SHELL) + target_sources(app PRIVATE + ${CHEF}/shell_common/globals.cpp + ${CHEF}/shell_common/cmd_misc.cpp + ${CHEF}/shell_common/cmd_otcli.cpp + ${CHEF}/shell_common/cmd_ping.cpp + ${CHEF}/shell_common/cmd_send.cpp + ) + +target_include_directories(app PRIVATE + ${CHEF}/shell_common/include +) +endif (CONFIG_ENABLE_CHIP_SHELL) + target_sources(app PRIVATE - ${APP_ROOT}/shell_common/globals.cpp - ${APP_ROOT}/shell_common/cmd_misc.cpp - ${APP_ROOT}/shell_common/cmd_otcli.cpp - ${APP_ROOT}/shell_common/cmd_ping.cpp - ${APP_ROOT}/shell_common/cmd_send.cpp - ${APP_ROOT}/nrfconnect/main.cpp + ${CHEF}/nrfconnect/main.cpp ${GEN_DIR}/callback-stub.cpp ${GEN_DIR}/IMClusterCommandHandler.cpp ${NRFCONNECT_COMMON}/util/ThreadUtil.cpp @@ -84,6 +93,7 @@ message(STATUS ${CHEF}/devices/${SAMPLE_NAME}.zap) chip_configure_data_model(app INCLUDE_SERVER ZAP_FILE ${CHEF}/devices/${SAMPLE_NAME}.zap + GEN_DIR ${GEN_DIR} ) @@ -98,3 +108,137 @@ elseif(CONFIG_OPENTHREAD_MTD) endif() include(${CHIP_ROOT}/config/nrfconnect/app/flashing.cmake) + + +if (CONFIG_ENABLE_PW_RPC) + +target_compile_options(app PRIVATE + "-DCONFIG_ENABLE_PW_RPC=1" +) + +# Make all targets created below depend on zephyr_interface to inherit MCU-related compilation flags +link_libraries($) + +set(PIGWEED_ROOT "${CHIP_ROOT}/third_party/pigweed/repo") +include(${PIGWEED_ROOT}/pw_build/pigweed.cmake) +include(${PIGWEED_ROOT}/pw_protobuf_compiler/proto.cmake) + +pw_set_backend(pw_log pw_log_basic) +pw_set_backend(pw_assert pw_assert_log) +pw_set_backend(pw_sys_io pw_sys_io.nrfconnect) +pw_set_backend(pw_trace pw_trace_tokenized) +set(dir_pw_third_party_nanopb "${CHIP_ROOT}/third_party/nanopb/repo" CACHE STRING "" FORCE) + +add_subdirectory(third_party/connectedhomeip/examples/platform/nrfconnect/pw_sys_io) +add_subdirectory(third_party/connectedhomeip/third_party/nanopb/repo) +add_subdirectory(third_party/connectedhomeip/third_party/pigweed/repo) + +pw_proto_library(attributes_service + SOURCES + ${CHIP_ROOT}/examples/common/pigweed/protos/attributes_service.proto + INPUTS + ${CHIP_ROOT}/examples/common/pigweed/protos/attributes_service.options + PREFIX + attributes_service + STRIP_PREFIX + ${CHIP_ROOT}/examples/common/pigweed/protos + DEPS + pw_protobuf.common_protos +) + +pw_proto_library(descriptor_service + SOURCES + ${CHIP_ROOT}/examples/common/pigweed/protos/descriptor_service.proto + PREFIX + descriptor_service + STRIP_PREFIX + ${CHIP_ROOT}/examples/common/pigweed/protos + DEPS + pw_protobuf.common_protos +) + +pw_proto_library(device_service + SOURCES + ${CHIP_ROOT}/examples/common/pigweed/protos/device_service.proto + INPUTS + ${CHIP_ROOT}/examples/common/pigweed/protos/device_service.options + PREFIX + device_service + STRIP_PREFIX + ${CHIP_ROOT}/examples/common/pigweed/protos + DEPS + pw_protobuf.common_protos +) + +pw_proto_library(ot_cli_service + SOURCES + ${CHIP_ROOT}/examples/common/pigweed/protos/ot_cli_service.proto + INPUTS + ${CHIP_ROOT}/examples/common/pigweed/protos/ot_cli_service.options + STRIP_PREFIX + ${CHIP_ROOT}/examples/common/pigweed/protos + PREFIX + ot_cli_service + DEPS + pw_protobuf.common_protos +) + +pw_proto_library(thread_service + SOURCES + ${CHIP_ROOT}/examples/common/pigweed/protos/thread_service.proto + INPUTS + ${CHIP_ROOT}/examples/common/pigweed/protos/thread_service.options + STRIP_PREFIX + ${CHIP_ROOT}/examples/common/pigweed/protos + PREFIX + thread_service + DEPS + pw_protobuf.common_protos +) + +target_sources(app PRIVATE + ../../common/pigweed/RpcService.cpp + ../../common/pigweed/nrfconnect/PigweedLoggerMutex.cpp + ${NRFCONNECT_COMMON}/Rpc.cpp + ${NRFCONNECT_COMMON}/util/PigweedLogger.cpp +) + +target_include_directories(app PRIVATE + ${PIGWEED_ROOT}/pw_sys_io/public + ${CHIP_ROOT}/src/lib/support + ${CHIP_ROOT}/src/system + ${NRFCONNECT_COMMON} + ${NRFCONNECT_COMMON}/util/include + ../../common + ../../common/pigweed + ../../common/pigweed/nrfconnect) + +target_compile_options(app PRIVATE + "-DPW_RPC_ATTRIBUTE_SERVICE=1" + "-DPW_RPC_DESCRIPTOR_SERVICE=1" + "-DPW_RPC_DEVICE_SERVICE=1" + "-DPW_RPC_THREAD_SERVICE=1" + "-DPW_RPC_TRACING_SERVICE=1" +) + +target_link_libraries(app PRIVATE + attributes_service.nanopb_rpc + descriptor_service.nanopb_rpc + device_service.nanopb_rpc + thread_service.nanopb_rpc + pw_checksum + pw_hdlc + pw_log + pw_rpc.server + pw_trace_tokenized + pw_trace_tokenized.trace_buffer + pw_trace_tokenized.rpc_service + pw_trace_tokenized.protos.nanopb_rpc +) + +target_link_options(app + PUBLIC + "-T${PIGWEED_ROOT}/pw_tokenizer/pw_tokenizer_linker_sections.ld" +) + +endif(CONFIG_ENABLE_PW_RPC) diff --git a/examples/chef/nrfconnect/main.cpp b/examples/chef/nrfconnect/main.cpp index bc7f210f82427a..3788d6ba6abbbf 100644 --- a/examples/chef/nrfconnect/main.cpp +++ b/examples/chef/nrfconnect/main.cpp @@ -34,6 +34,14 @@ #include #include +#include + +#ifdef CONFIG_ENABLE_PW_RPC +#include "Rpc.h" +#endif + +LOG_MODULE_REGISTER(app, CONFIG_MATTER_LOG_LEVEL); + using namespace chip; using namespace chip::Shell; using namespace chip::DeviceLayer; @@ -44,7 +52,13 @@ constexpr int kExtDiscoveryTimeoutSecs = 20; CHIP_ERROR main() { - CHIP_ERROR err = chip::Platform::MemoryInit(); + CHIP_ERROR err = CHIP_NO_ERROR; + + #ifdef CONFIG_ENABLE_PW_RPC + rpc::Init(); + #endif + + err = chip::Platform::MemoryInit(); if (err != CHIP_NO_ERROR) { ChipLogError(AppServer, "Platform::MemoryInit() failed"); diff --git a/examples/chef/nrfconnect/rpc.overlay b/examples/chef/nrfconnect/rpc.overlay new file mode 100644 index 00000000000000..77066d5c0ef5ac --- /dev/null +++ b/examples/chef/nrfconnect/rpc.overlay @@ -0,0 +1,49 @@ +# +# Copyright (c) 2020 Project CHIP Authors +# +# Licensed 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. +# + +# This file should be used as a configuration overlay to build Pigweed RPCs to +# lighting-app: +# +# west build -b nrf52840dk_nrf52840 -- -DOVERLAY_CONFIG=rpc.overlay + +# Enable Pigweed RPC +CONFIG_CHIP_PW_RPC=y + +# Add support for C++17 to build Pigweed components +CONFIG_STD_CPP14=n +CONFIG_STD_CPP17=y + +# Add support for Zephyr console component to use it for Pigweed console purposes +CONFIG_CONSOLE_SUBSYS=y +CONFIG_CONSOLE_GETCHAR=y +CONFIG_CONSOLE_PUTCHAR_BUFSIZE=256 + +# Disable features which may interfere with Pigweed HDLC transport +CONFIG_CHIP_LIB_SHELL=n +CONFIG_SHELL=n +CONFIG_OPENTHREAD_SHELL=n +CONFIG_BOOT_BANNER=n + +# Configure Zephyr logger with defaults backends disabled as the app provides its own, +# based on Pigweed HDLC. +CONFIG_LOG=y +CONFIG_LOG_MODE_MINIMAL=n +CONFIG_LOG_MODE_IMMEDIATE=y +CONFIG_LOG_BACKEND_UART=n +CONFIG_LOG_BACKEND_RTT=n + +# Increase zephyr tty rx buffer +CONFIG_CONSOLE_GETCHAR_BUFSIZE=128 diff --git a/examples/platform/nrfconnect/Rpc.cpp b/examples/platform/nrfconnect/Rpc.cpp index 8fa4fa7c864681..b9e1ae666f8be7 100644 --- a/examples/platform/nrfconnect/Rpc.cpp +++ b/examples/platform/nrfconnect/Rpc.cpp @@ -16,10 +16,13 @@ * limitations under the License. */ +#if defined(PW_RPC_BUTTON_SERVICE) && PW_RPC_BUTTON_SERVICE #include "AppTask.h" +#endif // defined(PW_RPC_BUTTON_SERVICE) && PW_RPC_BUTTON_SERVICE #include "PigweedLoggerMutex.h" #include "pigweed/RpcService.h" #include "pw_sys_io_nrfconnect/init.h" +#include #include From 27e393d58f85c9698e3efa3d63a2eff8cde7f208 Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Tue, 26 Apr 2022 19:51:56 +0000 Subject: [PATCH 2/3] Restyled by clang-format --- examples/chef/nrfconnect/main.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/chef/nrfconnect/main.cpp b/examples/chef/nrfconnect/main.cpp index 3788d6ba6abbbf..e8be3adc262cd1 100644 --- a/examples/chef/nrfconnect/main.cpp +++ b/examples/chef/nrfconnect/main.cpp @@ -54,9 +54,9 @@ CHIP_ERROR main() { CHIP_ERROR err = CHIP_NO_ERROR; - #ifdef CONFIG_ENABLE_PW_RPC - rpc::Init(); - #endif +#ifdef CONFIG_ENABLE_PW_RPC + rpc::Init(); +#endif err = chip::Platform::MemoryInit(); if (err != CHIP_NO_ERROR) From 2f5be669be90f0ffc278b830dff0935a916943c6 Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Tue, 26 Apr 2022 19:51:57 +0000 Subject: [PATCH 3/3] Restyled by autopep8 --- examples/chef/chef.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/chef/chef.py b/examples/chef/chef.py index bd15613db67323..be73c90663cfc0 100755 --- a/examples/chef/chef.py +++ b/examples/chef/chef.py @@ -358,9 +358,9 @@ def main(argv): nrf_build_cmd = "west build -b nrf52840dk_nrf52840" nrf_build_options = [] if options.doClean: - nrf_build_options.append("-p always") + nrf_build_options.append("-p always") if options.doRPC: - nrf_build_options.append("-- -DOVERLAY_CONFIG=rpc.overlay") + nrf_build_options.append("-- -DOVERLAY_CONFIG=rpc.overlay") queueCommand(nrf_build_cmd + " ".join(nrf_build_options)) elif options.buildTarget == "linux": queueCommand(f"cd {paths['rootSampleFolder']}/linux")