From b1f3cf645c22fa17a18ac4cb0df95cca326bc60a Mon Sep 17 00:00:00 2001
From: Marco Kurzynski <mkurzynski@wisc.edu>
Date: Mon, 18 Jul 2022 19:26:36 +0000
Subject: [PATCH] checkpoint

---
 src/client.cc | 38 ++++++++++++++++++++++++++++++++------
 src/server.cc | 13 ++++++-------
 src/shs.proto | 10 +++++++---
 3 files changed, 45 insertions(+), 16 deletions(-)

diff --git a/src/client.cc b/src/client.cc
index e435b1c..1069850 100644
--- a/src/client.cc
+++ b/src/client.cc
@@ -39,7 +39,8 @@ using grpc::CompletionQueue;
 using grpc::Status;
 using shs::Image;
 using shs::Node;
-using shs::Request;
+using shs::ImageRequest;
+using shs::Telemetry;
 
 template <size_t NUM_CHANNELS> class NodeClient {
 public:
@@ -50,8 +51,8 @@ public:
     }
   }
 
-  void Exposure() {
-    Request request;
+  void FetchImage() {
+    ImageRequest request;
     request.set_milliseconds(2);
     for (int i = 0; i < NUM_CHANNELS; i++) {
       readers_[i] =
@@ -71,8 +72,8 @@ public:
 private:
   class Reader : public grpc::ClientReadReactor<Image> {
   public:
-    Reader(Node::Stub *stub, const Request &request, int i) : i_(i) {
-      stub->async()->Exposure(&context_, &request, this);
+    Reader(Node::Stub *stub, const ImageRequest &request, int i) : i_(i) {
+      stub->async()->FetchImage(&context_, &request, this);
       StartCall();
       StartRead(&reply_);
     }
@@ -84,6 +85,31 @@ private:
       }
     }
     void OnDone(const Status &s) override {
+      Telemetry reply;
+      ClientContext context;
+      std::mutex mu;
+      std::condition_variable cv;
+      bool done = false;
+      Status status;
+
+      stub_->async()->FetchTelemetry(&context, &request, &reply,
+                                    [&mu, &cv, &done, &status](Status s) {
+                                      status = std::move(s);
+                                      std::lock_guard<std::mutex> lock(mu);
+                                      done = true;
+                                      cv.notify_one();
+                                    });
+      std::unique_lock<std::mutex> lock(mu);
+      cv.wait(lock, []{ return done; });
+
+      if (!status.ok()) {
+        std::cout << status.error_code() << ": " << status.error_message()
+                  << std::endl;
+        return;
+      }
+
+      uint64_t unixseconds = reply.unixseconds();
+
       // save picture
       int status = 0;
       long naxes[] = {1920, 1200};
@@ -129,7 +155,7 @@ int main(int argc, char **argv) {
                           grpc::InsecureChannelCredentials()),
   };
   NodeClient<1> Node(channels);
-  Node.Exposure();
+  Node.FetchImage();
 
   return 0;
 }
diff --git a/src/server.cc b/src/server.cc
index a0770e1..5bc5035 100644
--- a/src/server.cc
+++ b/src/server.cc
@@ -22,7 +22,7 @@ using grpc::ServerWriteReactor;
 using grpc::Status;
 using shs::Image;
 using shs::Node;
-using shs::Request;
+using shs::ImageRequest;
 using shs::Image;
 
 
@@ -30,14 +30,13 @@ static AtikCamerasSDKApp app;
 
 class NodeServiceImpl final : public Node::CallbackService {
 public:
-  ServerWriteReactor<Image> *Exposure(CallbackServerContext *context,
-                                      const Request *request) override {
+  ServerWriteReactor<Image> *FetchImage(CallbackServerContext *context,
+                                      const ImageRequest *request) override {
     class Streamer : public ServerWriteReactor<Image> {
     public:
-      Streamer(const Request *request) {
+      Streamer(const ImageRequest *request) {
         app.Start();
-        memcpy(buff, app.StartExposure(request->milliseconds()),
-               1920 * 1200 * sizeof(uint16_t));
+        buff = (uint16_t*)app.StartExposure(request->milliseconds());
         NextWrite();
       }
       void OnDone() override {
@@ -47,7 +46,7 @@ public:
       void OnWriteDone(bool) override { NextWrite(); }
 
     private:
-      uint16_t buff[1920 * 1200];
+      uint16_t* buff;
       AtikCamerasSDKApp app;
       Image image_;
       int i_ = 0;
diff --git a/src/shs.proto b/src/shs.proto
index efbd4f0..0063bf0 100644
--- a/src/shs.proto
+++ b/src/shs.proto
@@ -17,13 +17,17 @@ syntax = "proto3";
 package shs;
 
 service Node {
-  rpc Exposure (Request) returns (stream Image) {}
+  rpc FetchImage (ImageRequest) returns (Image) {}
+  rpc FetchTelemetry (google.protobuf.Empty) returns (Telemetry) {}
 }
 
-message Request {
+message ImageRequest {
   uint32 milliseconds = 1;
 }
-
 message Image {
   bytes imagedata = 1;
 }
+
+message Telemetry {
+  uint64 unixseconds = 1;
+}
-- 
GitLab