diff --git a/proto/mvlc.proto b/proto/mvlc.proto new file mode 100644 index 0000000..312690f --- /dev/null +++ b/proto/mvlc.proto @@ -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); +} diff --git a/proto/service.proto b/proto/service.proto index 2680a1e..4591a5c 100644 --- a/proto/service.proto +++ b/proto/service.proto @@ -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; +} diff --git a/proto/vme.proto b/proto/vme.proto new file mode 100644 index 0000000..99e4dff --- /dev/null +++ b/proto/vme.proto @@ -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); +} diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2040594..26785bb 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -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) diff --git a/src/mnode_proto_rpc_ping_server.cc b/src/mnode_proto_rpc_ping_server.cc new file mode 100644 index 0000000..1b8d8d8 --- /dev/null +++ b/src/mnode_proto_rpc_ping_server.cc @@ -0,0 +1,53 @@ +#include + +#include +#include +#include "proto/service.pb.h" +#include "proto/mvlc.pb.h" +#include +#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; +}