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"],
 )