1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "data_fetcher_shared_memory.h"
6
7#include "base/logging.h"
8#include "base/metrics/histogram.h"
9
10namespace {
11
12static bool SetMotionBuffer(content::DeviceMotionHardwareBuffer* buffer,
13    bool enabled) {
14  if (!buffer)
15    return false;
16  buffer->seqlock.WriteBegin();
17  buffer->data.allAvailableSensorsAreActive = enabled;
18  buffer->seqlock.WriteEnd();
19  return true;
20}
21
22static bool SetOrientationBuffer(
23    content::DeviceOrientationHardwareBuffer* buffer, bool enabled) {
24  if (!buffer)
25    return false;
26  buffer->seqlock.WriteBegin();
27  buffer->data.allAvailableSensorsAreActive = enabled;
28  buffer->seqlock.WriteEnd();
29  return true;
30}
31
32static bool SetLightBuffer(content::DeviceLightHardwareBuffer* buffer,
33                           double lux) {
34  if (!buffer)
35    return false;
36  buffer->seqlock.WriteBegin();
37  buffer->data.value = lux;
38  buffer->seqlock.WriteEnd();
39  return true;
40}
41
42}  // namespace
43
44namespace content {
45
46DataFetcherSharedMemory::DataFetcherSharedMemory()
47    : motion_buffer_(NULL), orientation_buffer_(NULL), light_buffer_(NULL) {
48}
49
50DataFetcherSharedMemory::~DataFetcherSharedMemory() {
51}
52
53bool DataFetcherSharedMemory::Start(ConsumerType consumer_type, void* buffer) {
54  DCHECK(buffer);
55
56  switch (consumer_type) {
57    case CONSUMER_TYPE_MOTION:
58      motion_buffer_ = static_cast<DeviceMotionHardwareBuffer*>(buffer);
59      UMA_HISTOGRAM_BOOLEAN("InertialSensor.MotionDefaultAvailable", false);
60      return SetMotionBuffer(motion_buffer_, true);
61    case CONSUMER_TYPE_ORIENTATION:
62      orientation_buffer_ =
63          static_cast<DeviceOrientationHardwareBuffer*>(buffer);
64      UMA_HISTOGRAM_BOOLEAN("InertialSensor.OrientationDefaultAvailable",
65          false);
66      return SetOrientationBuffer(orientation_buffer_, true);
67    case CONSUMER_TYPE_LIGHT:
68      light_buffer_ = static_cast<DeviceLightHardwareBuffer*>(buffer);
69      return SetLightBuffer(light_buffer_,
70                            std::numeric_limits<double>::infinity());
71    default:
72      NOTREACHED();
73  }
74  return false;
75}
76
77bool DataFetcherSharedMemory::Stop(ConsumerType consumer_type) {
78  switch (consumer_type) {
79    case CONSUMER_TYPE_MOTION:
80      return SetMotionBuffer(motion_buffer_, false);
81    case CONSUMER_TYPE_ORIENTATION:
82      return SetOrientationBuffer(orientation_buffer_, false);
83    case CONSUMER_TYPE_LIGHT:
84      return SetLightBuffer(light_buffer_, -1);
85    default:
86      NOTREACHED();
87  }
88  return false;
89}
90
91}  // namespace content
92