play with protos and service stub descriptors

This commit is contained in:
Florian Lüke 2024-12-08 13:49:46 +01:00
parent 3a6f7a36be
commit 7ab1af93e3
5 changed files with 188 additions and 4 deletions

38
proto/mvlc.proto Normal file
View file

@ -0,0 +1,38 @@
syntax = "proto3";
import "google/rpc/status.proto";
import "vme.proto";
option cc_generic_services = true;
package mesytec.mnode.mvlc;
message ReadRegisterRequest
{
uint32 address = 1;
}
message WriteRegisterRequest
{
uint32 address = 1;
uint32 value = 2;
}
message WriteRegisterResponse
{
optional google.rpc.Status status = 1;
}
message ReadRegisterResponse
{
optional uint32 value = 1;
optional google.rpc.Status status = 2;
}
service MVLC
{
rpc ReadRegister(ReadRegisterRequest) returns (ReadRegisterResponse);
rpc WriteRegister(WriteRegisterRequest) returns (WriteRegisterResponse);
rpc VMERead(mesytec.mnode.vme.ReadRequest) returns (mesytec.mnode.vme.ReadResponse);
rpc VMEWrite(mesytec.mnode.vme.WriteRequest) returns (mesytec.mnode.vme.WriteResponse);
}

View file

@ -1,19 +1,33 @@
syntax = "proto3";
import "google/protobuf/timestamp.proto";
option cc_generic_services = true;
package mesytec.mnode;
message SearchRequest {
string query = 1;
int32 page_number = 2;
int32 results_per_page = 3;
service PingService {
rpc Ping(mesytec.mnode.Ping) returns (Pong);
}
message Ping {
int32 peer_id = 1;
uint32 sequence_number = 2;
google.protobuf.Timestamp timestamp = 3;
}
message Pong {
int32 peer_id = 1;
uint32 sequence_number = 2;
}
service FooService {
rpc Foo(FooRequest) returns (FooResponse);
}
message FooRequest {
int32 foo_value = 1;
}
message FooResponse {
int32 bar_value = 1;
}

78
proto/vme.proto Normal file
View file

@ -0,0 +1,78 @@
syntax = "proto3";
import "google/rpc/status.proto";
option cc_generic_services = true;
package mesytec.mnode.vme;
enum DataWidth
{
D16 = 0;
D32 = 1;
}
message AddressModifier
{
uint32 value = 1;
}
enum EsstRate
{
UNKNOWN = 0;
RATE_160MB = 1;
RATE_276MB = 2;
RATE_320MB = 3;
}
message ReadRequestOptions
{
optional bool late_read = 1;
optional bool fifo_read = 2;
optional bool swapped_read = 3;
optional EsstRate esst_rate = 4;
optional uint32 max_transfers = 5;
}
message ReadRequest
{
uint32 address = 1;
AddressModifier amod = 2;
DataWidth width = 3;
ReadRequestOptions options = 4;
}
message WriteRequest
{
uint32 address = 1;
uint32 value = 2;
AddressModifier amod = 3;
DataWidth width = 4;
}
enum ResponseFlags
{
NONE = 0;
TIMEOUT = 1;
BUS_ERROR = 2;
SYNTAX_ERROR = 3;
}
message ReadResponse
{
repeated uint32 values = 1;
optional ResponseFlags flags = 2;
optional google.rpc.Status status = 3;
}
message WriteResponse
{
optional ResponseFlags flags = 2;
optional google.rpc.Status status = 3;
}
service VmeAccess
{
rpc Read(ReadRequest) returns (ReadResponse);
rpc Write(WriteRequest) returns (WriteResponse);
}

View file

@ -39,6 +39,7 @@ add_mnode_dev_executable(mesy_nng_sub_consumer)
add_mnode_proto_dev_executable(mnode_proto_test1)
add_mnode_proto_dev_executable(mnode_proto_ping_client)
add_mnode_proto_dev_executable(mnode_proto_ping_server)
add_mnode_proto_dev_executable(mnode_proto_rpc_ping_server)
#add_subdirectory(qt)

View file

@ -0,0 +1,53 @@
#include <memory>
#include <mesytec-mvlc/mesytec-mvlc.h>
#include <mesytec-mvlc/util/signal_handling.h>
#include "proto/service.pb.h"
#include "proto/mvlc.pb.h"
#include <mesytec-mnode/mnode_nng_async.h>
#include "internal/argh.h"
using namespace mesytec;
using namespace std::literals;
void print_service_descriptors(google::protobuf::Service &service)
{
auto sd = service.GetDescriptor();
spdlog::info("service: full_name={}, index={}, method_count={}",
sd->full_name(), sd->index(), sd->method_count());
for (int i = 0; i < sd->method_count(); ++i)
{
auto md = sd->method(i);
auto it = md->input_type();
auto ot = md->output_type();
spdlog::info(" method: full_name={}, index={}, input_type={}, output_type={}",
md->full_name(), md->index(), it->full_name(), ot->full_name());
}
}
int main()
{
namespace nng = mnode::nng;
spdlog::set_level(spdlog::level::debug);
mnode::PingService_Stub pingService(nullptr);
print_service_descriptors(pingService);
mnode::vme::VmeAccess_Stub vmeService(nullptr);
print_service_descriptors(vmeService);
mnode::mvlc::MVLC_Stub mvlcService(nullptr);
print_service_descriptors(mvlcService);
auto socket = nng::make_rep_socket();
if (int res = nng_listen(socket, "tcp://localhost:5555", nullptr, 0))
{
nng::mnode_nng_error("nng_listen", res);
return res;
}
return 0;
}