From d75e62a2cd5ce3281af24a06475f59aa2e69b61d Mon Sep 17 00:00:00 2001
From: Tim Uebelhoer <tim.uebelhoer@rwth-aachen.de>
Date: Tue, 19 Dec 2017 00:34:58 +0100
Subject: [PATCH] Added ping

---
 ModeliRpc/ModeliRpcNative/ModeliRpc.capnp.c++ | 149 +++++++++++---
 ModeliRpc/ModeliRpcNative/ModeliRpc.capnp.h   | 182 ++++++++++++++++++
 ModeliRpc/ModeliRpcNative/RpcFrontend.cpp     |   4 +
 3 files changed, 308 insertions(+), 27 deletions(-)

diff --git a/ModeliRpc/ModeliRpcNative/ModeliRpc.capnp.c++ b/ModeliRpc/ModeliRpcNative/ModeliRpc.capnp.c++
index 7b9a27e..4e842cc 100644
--- a/ModeliRpc/ModeliRpcNative/ModeliRpc.capnp.c++
+++ b/ModeliRpc/ModeliRpcNative/ModeliRpc.capnp.c++
@@ -5,7 +5,7 @@
 
 namespace capnp {
 namespace schemas {
-static const ::capnp::_::AlignedData<131> b_c189361aa8d3ec0a = {
+static const ::capnp::_::AlignedData<141> b_c189361aa8d3ec0a = {
   {   0,   0,   0,   0,   5,   0,   6,   0,
      10, 236, 211, 168,  26,  54, 137, 193,
      16,   0,   0,   0,   3,   0,   0,   0,
@@ -15,8 +15,8 @@ static const ::capnp::_::AlignedData<131> b_c189361aa8d3ec0a = {
      21,   0,   0,   0, 242,   0,   0,   0,
      33,   0,   0,   0,  23,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,
-     45,   0,   0,   0, 135,   2,   0,   0,
-    221,   1,   0,   0,   7,   0,   0,   0,
+     45,   0,   0,   0, 199,   2,   0,   0,
+      5,   2,   0,   0,   7,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,
      77, 111, 100, 101, 108, 105,  82, 112,
      99,  46,  99,  97, 112, 110, 112,  58,
@@ -27,87 +27,95 @@ static const ::capnp::_::AlignedData<131> b_c189361aa8d3ec0a = {
       1,   0,   0,   0,  98,   0,   0,   0,
      67, 104,  97, 110, 110, 101, 108,  76,
     105, 110, 107,   0,   0,   0,   0,   0,
-     40,   0,   0,   0,   3,   0,   5,   0,
+     44,   0,   0,   0,   3,   0,   5,   0,
       0,   0,   0,   0,   0,   0,   0,   0,
       5,  56,  43, 188,  82, 153,  97, 235,
      47,   7,  46, 236,  44, 131,  92, 147,
-     49,   1,   0,   0,  42,   0,   0,   0,
+     81,   1,   0,   0,  42,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,
-     37,   1,   0,   0,   7,   0,   0,   0,
+     69,   1,   0,   0,   7,   0,   0,   0,
       1,   0,   0,   0,   0,   0,   0,   0,
     254, 246, 209, 214, 117, 135, 213, 146,
      88,  61, 155, 234,  21, 143, 231, 220,
-     25,   1,   0,   0,  74,   0,   0,   0,
+     57,   1,   0,   0,  74,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,
-     17,   1,   0,   0,   7,   0,   0,   0,
+     49,   1,   0,   0,   7,   0,   0,   0,
       2,   0,   0,   0,   0,   0,   0,   0,
      62,   4,   3,  50, 160, 227,  99, 146,
      93, 181, 195, 175, 214, 105, 123, 142,
-      5,   1,   0,   0,  50,   0,   0,   0,
+     37,   1,   0,   0,  50,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,
-    249,   0,   0,   0,   7,   0,   0,   0,
+     25,   1,   0,   0,   7,   0,   0,   0,
       3,   0,   0,   0,   0,   0,   0,   0,
     214, 231, 151, 231,  56, 111,  46, 131,
      78,  71, 200, 119,  21, 194, 180, 201,
-    237,   0,   0,   0,  42,   0,   0,   0,
+     13,   1,   0,   0,  42,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,
-    225,   0,   0,   0,   7,   0,   0,   0,
+      1,   1,   0,   0,   7,   0,   0,   0,
       4,   0,   0,   0,   0,   0,   0,   0,
      24,  58, 213,  67,  42, 183,  62, 206,
     255, 190,  93, 229, 238,  75, 112, 148,
-    213,   0,   0,   0,  58,   0,   0,   0,
+    245,   0,   0,   0,  58,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,
-    201,   0,   0,   0,   7,   0,   0,   0,
+    233,   0,   0,   0,   7,   0,   0,   0,
       5,   0,   0,   0,   0,   0,   0,   0,
     159, 204, 110, 218, 169, 177,  82, 163,
     219, 213, 116,  86,  27, 175, 202, 134,
-    189,   0,   0,   0,  82,   0,   0,   0,
+    221,   0,   0,   0,  82,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,
-    181,   0,   0,   0,   7,   0,   0,   0,
+    213,   0,   0,   0,   7,   0,   0,   0,
       6,   0,   0,   0,   0,   0,   0,   0,
     103, 126,  58, 227, 215, 186,  36, 255,
      22, 199, 152,  43, 178, 255, 212, 138,
-    169,   0,   0,   0, 122,   0,   0,   0,
+    201,   0,   0,   0, 122,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,
-    161,   0,   0,   0,   7,   0,   0,   0,
+    193,   0,   0,   0,   7,   0,   0,   0,
       7,   0,   0,   0,   0,   0,   0,   0,
      11, 111,  14,  62, 127, 221, 158, 135,
     202, 134, 214, 251, 109,  26, 175, 152,
-    149,   0,   0,   0, 146,   0,   0,   0,
+    181,   0,   0,   0, 146,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,
-    145,   0,   0,   0,   7,   0,   0,   0,
+    177,   0,   0,   0,   7,   0,   0,   0,
       8,   0,   0,   0,   0,   0,   0,   0,
      45, 233, 149,  52,  53, 158, 225, 128,
      60, 226,  78,  51,  53,  87,  35, 233,
-    133,   0,   0,   0,  82,   0,   0,   0,
+    165,   0,   0,   0,  82,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,
-    125,   0,   0,   0,   7,   0,   0,   0,
+    157,   0,   0,   0,   7,   0,   0,   0,
       9,   0,   0,   0,   0,   0,   0,   0,
     162, 164, 186, 153,  85,  94,  47, 195,
     234, 153, 155, 234, 247, 207, 135, 176,
-    113,   0,   0,   0, 138,   0,   0,   0,
+    145,   0,   0,   0, 138,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   0,   0,
-    109,   0,   0,   0,   7,   0,   0,   0,
+    141,   0,   0,   0,   7,   0,   0,   0,
+     10,   0,   0,   0,   0,   0,   0,   0,
+     73, 246, 163,  97,  63,  51, 191, 246,
+    179, 221,  70, 157,  48,  29, 159, 245,
+    129,   0,   0,   0,  42,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+    117,   0,   0,   0,   7,   0,   0,   0,
     112, 108,  97, 121,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   1,   0,
     112, 108,  97, 121,  70,  97, 115, 116,
@@ -136,6 +144,8 @@ static const ::capnp::_::AlignedData<131> b_c189361aa8d3ec0a = {
      70, 114, 111, 110, 116, 101, 110, 100,
       0,   0,   0,   0,   0,   0,   0,   0,
       0,   0,   0,   0,   0,   0,   1,   0,
+    112, 105, 110, 103,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   1,   0,
       0,   0,   0,   0,   1,   0,   1,   0, }
 };
 ::capnp::word const* const bp_c189361aa8d3ec0a = b_c189361aa8d3ec0a.words;
@@ -160,12 +170,14 @@ static const ::capnp::_::RawSchema* const d_c189361aa8d3ec0a[] = {
   &s_dce78f15ea9b3d58,
   &s_e9235735334ee23c,
   &s_eb619952bc2b3805,
+  &s_f59f1d309d46ddb3,
+  &s_f6bf333f61a3f649,
   &s_ff24bad7e33a7e67,
 };
-static const uint16_t m_c189361aa8d3ec0a[] = {6, 4, 2, 0, 1, 9, 7, 5, 8, 3};
+static const uint16_t m_c189361aa8d3ec0a[] = {6, 4, 2, 10, 0, 1, 9, 7, 5, 8, 3};
 const ::capnp::_::RawSchema s_c189361aa8d3ec0a = {
-  0xc189361aa8d3ec0a, b_c189361aa8d3ec0a.words, 131, d_c189361aa8d3ec0a, m_c189361aa8d3ec0a,
-  20, 10, nullptr, nullptr, nullptr, { &s_c189361aa8d3ec0a, nullptr, nullptr, 0, 0, nullptr }
+  0xc189361aa8d3ec0a, b_c189361aa8d3ec0a.words, 141, d_c189361aa8d3ec0a, m_c189361aa8d3ec0a,
+  22, 11, nullptr, nullptr, nullptr, { &s_c189361aa8d3ec0a, nullptr, nullptr, 0, 0, nullptr }
 };
 #endif  // !CAPNP_LITE
 static const ::capnp::_::AlignedData<116> b_ae08c157b2e82b54 = {
@@ -1144,6 +1156,60 @@ const ::capnp::_::RawSchema s_b087cff7ea9b99ea = {
   0, 0, nullptr, nullptr, nullptr, { &s_b087cff7ea9b99ea, nullptr, nullptr, 0, 0, nullptr }
 };
 #endif  // !CAPNP_LITE
+static const ::capnp::_::AlignedData<18> b_f6bf333f61a3f649 = {
+  {   0,   0,   0,   0,   5,   0,   6,   0,
+     73, 246, 163,  97,  63,  51, 191, 246,
+     30,   0,   0,   0,   1,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   7,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+     21,   0,   0,   0,  82,   1,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+     77, 111, 100, 101, 108, 105,  82, 112,
+     99,  46,  99,  97, 112, 110, 112,  58,
+     77, 111, 100, 101, 108, 105,  66,  97,
+     99, 107, 101, 110, 100,  46, 112, 105,
+    110, 103,  36,  80,  97, 114,  97, 109,
+    115,   0,   0,   0,   0,   0,   0,   0, }
+};
+::capnp::word const* const bp_f6bf333f61a3f649 = b_f6bf333f61a3f649.words;
+#if !CAPNP_LITE
+const ::capnp::_::RawSchema s_f6bf333f61a3f649 = {
+  0xf6bf333f61a3f649, b_f6bf333f61a3f649.words, 18, nullptr, nullptr,
+  0, 0, nullptr, nullptr, nullptr, { &s_f6bf333f61a3f649, nullptr, nullptr, 0, 0, nullptr }
+};
+#endif  // !CAPNP_LITE
+static const ::capnp::_::AlignedData<18> b_f59f1d309d46ddb3 = {
+  {   0,   0,   0,   0,   5,   0,   6,   0,
+    179, 221,  70, 157,  48,  29, 159, 245,
+     30,   0,   0,   0,   1,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   7,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+     21,   0,   0,   0,  90,   1,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+     77, 111, 100, 101, 108, 105,  82, 112,
+     99,  46,  99,  97, 112, 110, 112,  58,
+     77, 111, 100, 101, 108, 105,  66,  97,
+     99, 107, 101, 110, 100,  46, 112, 105,
+    110, 103,  36,  82, 101, 115, 117, 108,
+    116, 115,   0,   0,   0,   0,   0,   0, }
+};
+::capnp::word const* const bp_f59f1d309d46ddb3 = b_f59f1d309d46ddb3.words;
+#if !CAPNP_LITE
+const ::capnp::_::RawSchema s_f59f1d309d46ddb3 = {
+  0xf59f1d309d46ddb3, b_f59f1d309d46ddb3.words, 18, nullptr, nullptr,
+  0, 0, nullptr, nullptr, nullptr, { &s_f59f1d309d46ddb3, nullptr, nullptr, 0, 0, nullptr }
+};
+#endif  // !CAPNP_LITE
 static const ::capnp::_::AlignedData<40> b_cc4550916ea17af4 = {
   {   0,   0,   0,   0,   5,   0,   6,   0,
     244, 122, 161, 110, 145,  80,  69, 204,
@@ -1707,6 +1773,16 @@ ModeliBackend::Client::registerFrontendRequest(::kj::Maybe< ::capnp::MessageSize
       "ModeliRpc.capnp:ModeliBackend", "registerFrontend",
       0xc189361aa8d3ec0aull, 9);
 }
+::capnp::Request< ::ModeliBackend::PingParams,  ::ModeliBackend::PingResults>
+ModeliBackend::Client::pingRequest(::kj::Maybe< ::capnp::MessageSize> sizeHint) {
+  return newCall< ::ModeliBackend::PingParams,  ::ModeliBackend::PingResults>(
+      0xc189361aa8d3ec0aull, 10, sizeHint);
+}
+::kj::Promise<void> ModeliBackend::Server::ping(PingContext) {
+  return ::capnp::Capability::Server::internalUnimplemented(
+      "ModeliRpc.capnp:ModeliBackend", "ping",
+      0xc189361aa8d3ec0aull, 10);
+}
 ::kj::Promise<void> ModeliBackend::Server::dispatchCall(
     uint64_t interfaceId, uint16_t methodId,
     ::capnp::CallContext< ::capnp::AnyPointer, ::capnp::AnyPointer> context) {
@@ -1751,6 +1827,9 @@ ModeliBackend::Client::registerFrontendRequest(::kj::Maybe< ::capnp::MessageSize
     case 9:
       return registerFrontend(::capnp::Capability::Server::internalGetTypedContext<
            ::ModeliBackend::RegisterFrontendParams,  ::ModeliBackend::RegisterFrontendResults>(context));
+    case 10:
+      return ping(::capnp::Capability::Server::internalGetTypedContext<
+           ::ModeliBackend::PingParams,  ::ModeliBackend::PingResults>(context));
     default:
       (void)context;
       return ::capnp::Capability::Server::internalUnimplemented(
@@ -1934,6 +2013,22 @@ constexpr ::capnp::Kind ModeliBackend::RegisterFrontendResults::_capnpPrivate::k
 constexpr ::capnp::_::RawSchema const* ModeliBackend::RegisterFrontendResults::_capnpPrivate::schema;
 #endif  // !CAPNP_LITE
 
+// ModeliBackend::PingParams
+constexpr uint16_t ModeliBackend::PingParams::_capnpPrivate::dataWordSize;
+constexpr uint16_t ModeliBackend::PingParams::_capnpPrivate::pointerCount;
+#if !CAPNP_LITE
+constexpr ::capnp::Kind ModeliBackend::PingParams::_capnpPrivate::kind;
+constexpr ::capnp::_::RawSchema const* ModeliBackend::PingParams::_capnpPrivate::schema;
+#endif  // !CAPNP_LITE
+
+// ModeliBackend::PingResults
+constexpr uint16_t ModeliBackend::PingResults::_capnpPrivate::dataWordSize;
+constexpr uint16_t ModeliBackend::PingResults::_capnpPrivate::pointerCount;
+#if !CAPNP_LITE
+constexpr ::capnp::Kind ModeliBackend::PingResults::_capnpPrivate::kind;
+constexpr ::capnp::_::RawSchema const* ModeliBackend::PingResults::_capnpPrivate::schema;
+#endif  // !CAPNP_LITE
+
 #if !CAPNP_LITE
 ::capnp::Request< ::ModeliFrontend::NewValuesParams,  ::ModeliFrontend::NewValuesResults>
 ModeliFrontend::Client::newValuesRequest(::kj::Maybe< ::capnp::MessageSize> sizeHint) {
diff --git a/ModeliRpc/ModeliRpcNative/ModeliRpc.capnp.h b/ModeliRpc/ModeliRpcNative/ModeliRpc.capnp.h
index 1f36039..4200b6a 100644
--- a/ModeliRpc/ModeliRpcNative/ModeliRpc.capnp.h
+++ b/ModeliRpc/ModeliRpcNative/ModeliRpc.capnp.h
@@ -39,6 +39,8 @@ CAPNP_DECLARE_SCHEMA(80e19e353495e92d);
 CAPNP_DECLARE_SCHEMA(e9235735334ee23c);
 CAPNP_DECLARE_SCHEMA(c32f5e5599baa4a2);
 CAPNP_DECLARE_SCHEMA(b087cff7ea9b99ea);
+CAPNP_DECLARE_SCHEMA(f6bf333f61a3f649);
+CAPNP_DECLARE_SCHEMA(f59f1d309d46ddb3);
 CAPNP_DECLARE_SCHEMA(cc4550916ea17af4);
 CAPNP_DECLARE_SCHEMA(89822c8798268361);
 CAPNP_DECLARE_SCHEMA(dec8cbe4e9ea46c4);
@@ -79,6 +81,8 @@ struct ModeliBackend {
   struct SetValuesResults;
   struct RegisterFrontendParams;
   struct RegisterFrontendResults;
+  struct PingParams;
+  struct PingResults;
 
   #if !CAPNP_LITE
   struct _capnpPrivate {
@@ -403,6 +407,36 @@ struct ModeliBackend::RegisterFrontendResults {
   };
 };
 
+struct ModeliBackend::PingParams {
+  PingParams() = delete;
+
+  class Reader;
+  class Builder;
+  class Pipeline;
+
+  struct _capnpPrivate {
+    CAPNP_DECLARE_STRUCT_HEADER(f6bf333f61a3f649, 0, 0)
+    #if !CAPNP_LITE
+    static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; }
+    #endif  // !CAPNP_LITE
+  };
+};
+
+struct ModeliBackend::PingResults {
+  PingResults() = delete;
+
+  class Reader;
+  class Builder;
+  class Pipeline;
+
+  struct _capnpPrivate {
+    CAPNP_DECLARE_STRUCT_HEADER(f59f1d309d46ddb3, 0, 0)
+    #if !CAPNP_LITE
+    static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; }
+    #endif  // !CAPNP_LITE
+  };
+};
+
 struct ModeliFrontend {
   ModeliFrontend() = delete;
 
@@ -540,6 +574,8 @@ public:
       ::kj::Maybe< ::capnp::MessageSize> sizeHint = nullptr);
   ::capnp::Request< ::ModeliBackend::RegisterFrontendParams,  ::ModeliBackend::RegisterFrontendResults> registerFrontendRequest(
       ::kj::Maybe< ::capnp::MessageSize> sizeHint = nullptr);
+  ::capnp::Request< ::ModeliBackend::PingParams,  ::ModeliBackend::PingResults> pingRequest(
+      ::kj::Maybe< ::capnp::MessageSize> sizeHint = nullptr);
 
 protected:
   Client() = default;
@@ -595,6 +631,10 @@ protected:
   typedef  ::ModeliBackend::RegisterFrontendResults RegisterFrontendResults;
   typedef ::capnp::CallContext<RegisterFrontendParams, RegisterFrontendResults> RegisterFrontendContext;
   virtual ::kj::Promise<void> registerFrontend(RegisterFrontendContext context);
+  typedef  ::ModeliBackend::PingParams PingParams;
+  typedef  ::ModeliBackend::PingResults PingResults;
+  typedef ::capnp::CallContext<PingParams, PingResults> PingContext;
+  virtual ::kj::Promise<void> ping(PingContext context);
 
   inline  ::ModeliBackend::Client thisCap() {
     return ::capnp::Capability::Server::thisCap()
@@ -2260,6 +2300,148 @@ private:
 };
 #endif  // !CAPNP_LITE
 
+class ModeliBackend::PingParams::Reader {
+public:
+  typedef PingParams Reads;
+
+  Reader() = default;
+  inline explicit Reader(::capnp::_::StructReader base): _reader(base) {}
+
+  inline ::capnp::MessageSize totalSize() const {
+    return _reader.totalSize().asPublic();
+  }
+
+#if !CAPNP_LITE
+  inline ::kj::StringTree toString() const {
+    return ::capnp::_::structString(_reader, *_capnpPrivate::brand());
+  }
+#endif  // !CAPNP_LITE
+
+private:
+  ::capnp::_::StructReader _reader;
+  template <typename, ::capnp::Kind>
+  friend struct ::capnp::ToDynamic_;
+  template <typename, ::capnp::Kind>
+  friend struct ::capnp::_::PointerHelpers;
+  template <typename, ::capnp::Kind>
+  friend struct ::capnp::List;
+  friend class ::capnp::MessageBuilder;
+  friend class ::capnp::Orphanage;
+};
+
+class ModeliBackend::PingParams::Builder {
+public:
+  typedef PingParams Builds;
+
+  Builder() = delete;  // Deleted to discourage incorrect usage.
+                       // You can explicitly initialize to nullptr instead.
+  inline Builder(decltype(nullptr)) {}
+  inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {}
+  inline operator Reader() const { return Reader(_builder.asReader()); }
+  inline Reader asReader() const { return *this; }
+
+  inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); }
+#if !CAPNP_LITE
+  inline ::kj::StringTree toString() const { return asReader().toString(); }
+#endif  // !CAPNP_LITE
+
+private:
+  ::capnp::_::StructBuilder _builder;
+  template <typename, ::capnp::Kind>
+  friend struct ::capnp::ToDynamic_;
+  friend class ::capnp::Orphanage;
+  template <typename, ::capnp::Kind>
+  friend struct ::capnp::_::PointerHelpers;
+};
+
+#if !CAPNP_LITE
+class ModeliBackend::PingParams::Pipeline {
+public:
+  typedef PingParams Pipelines;
+
+  inline Pipeline(decltype(nullptr)): _typeless(nullptr) {}
+  inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless)
+      : _typeless(kj::mv(typeless)) {}
+
+private:
+  ::capnp::AnyPointer::Pipeline _typeless;
+  friend class ::capnp::PipelineHook;
+  template <typename, ::capnp::Kind>
+  friend struct ::capnp::ToDynamic_;
+};
+#endif  // !CAPNP_LITE
+
+class ModeliBackend::PingResults::Reader {
+public:
+  typedef PingResults Reads;
+
+  Reader() = default;
+  inline explicit Reader(::capnp::_::StructReader base): _reader(base) {}
+
+  inline ::capnp::MessageSize totalSize() const {
+    return _reader.totalSize().asPublic();
+  }
+
+#if !CAPNP_LITE
+  inline ::kj::StringTree toString() const {
+    return ::capnp::_::structString(_reader, *_capnpPrivate::brand());
+  }
+#endif  // !CAPNP_LITE
+
+private:
+  ::capnp::_::StructReader _reader;
+  template <typename, ::capnp::Kind>
+  friend struct ::capnp::ToDynamic_;
+  template <typename, ::capnp::Kind>
+  friend struct ::capnp::_::PointerHelpers;
+  template <typename, ::capnp::Kind>
+  friend struct ::capnp::List;
+  friend class ::capnp::MessageBuilder;
+  friend class ::capnp::Orphanage;
+};
+
+class ModeliBackend::PingResults::Builder {
+public:
+  typedef PingResults Builds;
+
+  Builder() = delete;  // Deleted to discourage incorrect usage.
+                       // You can explicitly initialize to nullptr instead.
+  inline Builder(decltype(nullptr)) {}
+  inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {}
+  inline operator Reader() const { return Reader(_builder.asReader()); }
+  inline Reader asReader() const { return *this; }
+
+  inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); }
+#if !CAPNP_LITE
+  inline ::kj::StringTree toString() const { return asReader().toString(); }
+#endif  // !CAPNP_LITE
+
+private:
+  ::capnp::_::StructBuilder _builder;
+  template <typename, ::capnp::Kind>
+  friend struct ::capnp::ToDynamic_;
+  friend class ::capnp::Orphanage;
+  template <typename, ::capnp::Kind>
+  friend struct ::capnp::_::PointerHelpers;
+};
+
+#if !CAPNP_LITE
+class ModeliBackend::PingResults::Pipeline {
+public:
+  typedef PingResults Pipelines;
+
+  inline Pipeline(decltype(nullptr)): _typeless(nullptr) {}
+  inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless)
+      : _typeless(kj::mv(typeless)) {}
+
+private:
+  ::capnp::AnyPointer::Pipeline _typeless;
+  friend class ::capnp::PipelineHook;
+  template <typename, ::capnp::Kind>
+  friend struct ::capnp::ToDynamic_;
+};
+#endif  // !CAPNP_LITE
+
 #if !CAPNP_LITE
 class ModeliFrontend::Client
     : public virtual ::capnp::Capability::Client {
diff --git a/ModeliRpc/ModeliRpcNative/RpcFrontend.cpp b/ModeliRpc/ModeliRpcNative/RpcFrontend.cpp
index f7d0021..ace8bce 100644
--- a/ModeliRpc/ModeliRpcNative/RpcFrontend.cpp
+++ b/ModeliRpc/ModeliRpcNative/RpcFrontend.cpp
@@ -20,7 +20,11 @@ void RpcFrontend::destroy()
 
 void RpcFrontend::connect(std::string address, unsigned int port)
 {
+    // Create client
     _client = std::make_unique<capnp::EzRpcClient>(address, port);
+    // Test connection by pinging
+    auto backend = _client->getMain<ModeliBackend>();
+    backend.pingRequest().send().wait(_client->getWaitScope());
 }
 
 void RpcFrontend::registerCallbacks(NewValuesCallback newValuesCallback, LogCallback logCallback)
-- 
GitLab