Chromium Code Reviews| Index: content/browser/device_sensors/data_fetcher_shared_memory_win.cc |
| diff --git a/content/browser/device_sensors/data_fetcher_shared_memory_win.cc b/content/browser/device_sensors/data_fetcher_shared_memory_win.cc |
| index 77c962ecd9b97b80fb2c3cc30ca1b6f5d47a75f4..e21443bd2e9f79f6843b655f7780dbc7621efa33 100644 |
| --- a/content/browser/device_sensors/data_fetcher_shared_memory_win.cc |
| +++ b/content/browser/device_sensors/data_fetcher_shared_memory_win.cc |
| @@ -18,6 +18,12 @@ namespace { |
| const double kMeanGravity = 9.80665; |
| +void SetLightBuffer(content::DeviceLightHardwareBuffer* buffer, double lux) { |
|
timvolodine
2015/03/04 12:06:37
nit: DCHECK(buffer)?
|
| + buffer->seqlock.WriteBegin(); |
| + buffer->data.value = lux; |
| + buffer->seqlock.WriteEnd(); |
| +} |
| + |
| } // namespace |
| @@ -222,8 +228,41 @@ class DataFetcherSharedMemory::SensorEventSinkMotion |
| DISALLOW_COPY_AND_ASSIGN(SensorEventSinkMotion); |
| }; |
| +class DataFetcherSharedMemory::SensorEventSinkLight |
| + : public DataFetcherSharedMemory::SensorEventSink { |
| + public: |
| + explicit SensorEventSinkLight(DeviceLightHardwareBuffer* const buffer) |
| + : buffer_(buffer) {} |
| + virtual ~SensorEventSinkLight() {} |
| + |
| + protected: |
| + virtual bool UpdateSharedMemoryBuffer(ISensor* sensor, |
| + ISensorDataReport* new_data) override { |
| + double lux; |
| + bool has_lux; |
| + |
| + GetSensorValue(SENSOR_DATA_TYPE_LIGHT_LEVEL_LUX, new_data, &lux, &has_lux); |
| + |
| + if(!has_lux) { |
| + // Could not get lux value. |
| + return false; |
| + } |
| + |
| + SetLightBuffer(buffer_, lux); |
| + |
| + return true; |
| + } |
| + |
| + private: |
| + DeviceLightHardwareBuffer* const buffer_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(SensorEventSinkLight); |
| +}; |
| + |
| DataFetcherSharedMemory::DataFetcherSharedMemory() |
| - : motion_buffer_(nullptr), orientation_buffer_(nullptr) { |
| + : motion_buffer_(nullptr), |
| + orientation_buffer_(nullptr), |
| + light_buffer_(nullptr) { |
| } |
| DataFetcherSharedMemory::~DataFetcherSharedMemory() { |
| @@ -277,6 +316,22 @@ bool DataFetcherSharedMemory::Start(ConsumerType consumer_type, void* buffer) { |
| SetBufferAvailableState(consumer_type, true); |
| } |
| break; |
| + case CONSUMER_TYPE_LIGHT: |
| + { |
| + light_buffer_ = static_cast<DeviceLightHardwareBuffer*>(buffer); |
| + scoped_refptr<SensorEventSink> sink( |
| + new SensorEventSinkLight(light_buffer_)); |
| + bool sensor_light_available = RegisterForSensor( |
| + SENSOR_TYPE_AMBIENT_LIGHT, sensor_light_.Receive(), sink); |
| + if (sensor_light_available) { |
| + SetLightBuffer(light_buffer_, -1); |
| + return true; |
| + } |
| + |
| + // if no sensors are available, fire an Infinity event. |
| + SetLightBuffer(light_buffer_, std::numeric_limits<double>::infinity()); |
| + } |
| + break; |
| default: |
| NOTREACHED(); |
| } |
| @@ -293,6 +348,10 @@ bool DataFetcherSharedMemory::Stop(ConsumerType consumer_type) { |
| case CONSUMER_TYPE_MOTION: |
| motion_buffer_ = nullptr; |
| return true; |
| + case CONSUMER_TYPE_LIGHT: |
| + SetLightBuffer(light_buffer_, -1); |
| + light_buffer_ = nullptr; |
| + return true; |
| default: |
| NOTREACHED(); |
| } |
| @@ -368,6 +427,12 @@ void DataFetcherSharedMemory::DisableSensors(ConsumerType consumer_type) { |
| sensor_gyrometer_.Release(); |
| } |
| break; |
| + case CONSUMER_TYPE_LIGHT: |
| + if (sensor_light_.get()) { |
| + sensor_light_->SetEventSink(nullptr); |
| + sensor_light_.Release(); |
| + } |
| + break; |
| default: |
| NOTREACHED(); |
| } |