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