// 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:
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> {
// 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) {
// 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 {