OSDN Git Service

Resurrect the pose tool.
authorOkan Arikan <okana@google.com>
Mon, 5 Jun 2017 23:21:42 +0000 (16:21 -0700)
committerOkan Arikan <okana@google.com>
Mon, 5 Jun 2017 23:41:21 +0000 (16:41 -0700)
Editing the tool to look into the same broadcast ring that
VrCore reads from.

Bug: 62355308
Test: Run pose tool
Change-Id: I270e3934c7df398048701a81851ee860a8acb712

libs/vr/libdisplay/include/private/dvr/shared_buffer_helpers.h
libs/vr/libvrsensor/pose_client.cpp

index ed06515..20541a6 100644 (file)
@@ -103,9 +103,14 @@ class CPUMappedBroadcastRing : public CPUMappedBuffer {
   // Try obtaining the ring. If the named buffer has not been created yet, it
   // will return nullptr.
   RingType* Ring() {
-    if (IsMapped() == false) {
-      TryMapping();
+    // No ring created yet?
+    if (ring_ == nullptr) {
+      // Not mapped the memory yet?
+      if (IsMapped() == false) {
+        TryMapping();
+      }
 
+      // If have the memory mapped, allocate the ring.
       if (IsMapped()) {
         switch (usage_mode_) {
           case CPUUsageMode::READ_OFTEN:
index b21c7cf..4ddf1f3 100644 (file)
@@ -22,6 +22,11 @@ using android::pdx::Transaction;
 
 namespace android {
 namespace dvr {
+namespace {
+
+typedef CPUMappedBroadcastRing<DvrPoseRing> SensorPoseRing;
+
+}  // namespace
 
 // PoseClient is a remote interface to the pose service in sensord.
 class PoseClient : public pdx::ClientBase<PoseClient> {
@@ -36,16 +41,21 @@ class PoseClient : public pdx::ClientBase<PoseClient> {
   // Polls the pose service for the current state and stores it in *state.
   // Returns zero on success, a negative error code otherwise.
   int Poll(DvrPose* state) {
-    const auto vsync_buffer = GetVsyncBuffer();
-    if (vsync_buffer) {
-      if (state) {
-        // Fill the state
-        *state = vsync_buffer->current_pose;
+    // Allocate the helper class to access the sensor pose buffer.
+    if (sensor_pose_buffer_ == nullptr) {
+      sensor_pose_buffer_ = std::make_unique<SensorPoseRing>(
+          DvrGlobalBuffers::kSensorPoseBuffer, CPUUsageMode::READ_RARELY);
+    }
+
+    if (state) {
+      if (sensor_pose_buffer_->GetNewest(state)) {
+        return 0;
+      } else {
+        return -EAGAIN;
       }
-      return -EINVAL;
     }
 
-    return -EAGAIN;
+    return -EINVAL;
   }
 
   int GetPose(uint32_t vsync_count, DvrPoseAsync* out_pose) {
@@ -235,6 +245,9 @@ class PoseClient : public pdx::ClientBase<PoseClient> {
   // The vsync pose buffer if already mapped.
   std::unique_ptr<CPUMappedBuffer> vsync_pose_buffer_;
 
+  // The direct sensor pose buffer.
+  std::unique_ptr<SensorPoseRing> sensor_pose_buffer_;
+
   const DvrVsyncPoseBuffer* mapped_vsync_pose_buffer_ = nullptr;
 
   struct ControllerClientState {