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