pw_rpc#
Efficient, low-code-size RPC system for embedded devices
Stable C++ Java JavaScript Python TypeScript
/* //applications/blinky/blinky.proto */
syntax = "proto3";
package blinky;
import "pw_protobuf_protos/common.proto";
service Blinky {
// Toggles the LED on or off.
rpc ToggleLed(pw.protobuf.Empty) returns (pw.protobuf.Empty);
// Continuously blinks the board LED a specified number of times.
rpc Blink(BlinkRequest) returns (pw.protobuf.Empty);
}
message BlinkRequest {
// The interval at which to blink the LED, in milliseconds.
uint32 interval_ms = 1;
// The number of times to blink the LED.
optional uint32 blink_count = 2;
} // BlinkRequest
/* //applications/blinky/main.cc */
// ...
#include "applications/blinky/blinky.rpc.pb.h"
#include "pw_system/rpc_server.h"
// ...
class BlinkyService final
: public blinky::pw_rpc::nanopb::Blinky::Service<BlinkyService> {
public:
pw::Status ToggleLed(const pw_protobuf_Empty &, pw_protobuf_Empty &) {
// Turn the LED off if it's currently on and vice versa
}
pw::Status Blink(const blinky_BlinkRequest &request, pw_protobuf_Empty &) {
if (request.blink_count == 0) {
// Stop blinking
}
if (request.interval_ms > 0) {
// Change the blink interval
}
if (request.has_blink_count) { // Auto-generated property
// Blink request.blink_count times
}
}
};
BlinkyService blinky_service;
namespace pw::system {
void UserAppInit() {
// ...
pw::system::GetRpcServer().RegisterService(blinky_service);
}
} // namespace pw::system
# //applications/blinky/BUILD.bazel
load(
"@pigweed//pw_protobuf_compiler:pw_proto_library.bzl",
"nanopb_proto_library",
"nanopb_rpc_proto_library",
)
cc_binary(
name = "blinky",
srcs = ["main.cc"],
deps = [
":nanopb_rpc",
# ...
"@pigweed//pw_system",
],
)
proto_library(
name = "proto",
srcs = ["blinky.proto"],
deps = [
"@pigweed//pw_protobuf:common_proto",
],
)
nanopb_proto_library(
name = "nanopb",
deps = [":proto"],
)
nanopb_rpc_proto_library(
name = "nanopb_rpc",
nanopb_proto_library_deps = [":nanopb"],
deps = [":proto"],
)