Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(272)

Side by Side Diff: content/browser/device_sensors/data_fetcher_shared_memory_win.cc

Issue 754963006: Windows: Ambient Light API (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix comments Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « content/browser/device_sensors/data_fetcher_shared_memory.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/device_sensors/data_fetcher_shared_memory.h" 5 #include "content/browser/device_sensors/data_fetcher_shared_memory.h"
6 6
7 #include <GuidDef.h> 7 #include <GuidDef.h>
8 #include <InitGuid.h> 8 #include <InitGuid.h>
9 #include <PortableDeviceTypes.h> 9 #include <PortableDeviceTypes.h>
10 #include <Sensors.h> 10 #include <Sensors.h>
11 11
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "base/metrics/histogram.h" 13 #include "base/metrics/histogram.h"
14 #include "base/win/iunknown_impl.h" 14 #include "base/win/iunknown_impl.h"
15 #include "base/win/windows_version.h" 15 #include "base/win/windows_version.h"
16 16
17 namespace { 17 namespace {
18 18
19 const double kMeanGravity = 9.80665; 19 const double kMeanGravity = 9.80665;
20 20
21 void SetLightBuffer(content::DeviceLightHardwareBuffer* buffer, double lux) {
timvolodine 2015/03/04 12:06:37 nit: DCHECK(buffer)?
22 buffer->seqlock.WriteBegin();
23 buffer->data.value = lux;
24 buffer->seqlock.WriteEnd();
25 }
26
21 } // namespace 27 } // namespace
22 28
23 29
24 namespace content { 30 namespace content {
25 31
26 class DataFetcherSharedMemory::SensorEventSink 32 class DataFetcherSharedMemory::SensorEventSink
27 : public ISensorEvents, public base::win::IUnknownImpl { 33 : public ISensorEvents, public base::win::IUnknownImpl {
28 public: 34 public:
29 SensorEventSink() {} 35 SensorEventSink() {}
30 virtual ~SensorEventSink() {} 36 virtual ~SensorEventSink() {}
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 221
216 return true; 222 return true;
217 } 223 }
218 224
219 private: 225 private:
220 DeviceMotionHardwareBuffer* const buffer_; 226 DeviceMotionHardwareBuffer* const buffer_;
221 227
222 DISALLOW_COPY_AND_ASSIGN(SensorEventSinkMotion); 228 DISALLOW_COPY_AND_ASSIGN(SensorEventSinkMotion);
223 }; 229 };
224 230
231 class DataFetcherSharedMemory::SensorEventSinkLight
232 : public DataFetcherSharedMemory::SensorEventSink {
233 public:
234 explicit SensorEventSinkLight(DeviceLightHardwareBuffer* const buffer)
235 : buffer_(buffer) {}
236 virtual ~SensorEventSinkLight() {}
237
238 protected:
239 virtual bool UpdateSharedMemoryBuffer(ISensor* sensor,
240 ISensorDataReport* new_data) override {
241 double lux;
242 bool has_lux;
243
244 GetSensorValue(SENSOR_DATA_TYPE_LIGHT_LEVEL_LUX, new_data, &lux, &has_lux);
245
246 if(!has_lux) {
247 // Could not get lux value.
248 return false;
249 }
250
251 SetLightBuffer(buffer_, lux);
252
253 return true;
254 }
255
256 private:
257 DeviceLightHardwareBuffer* const buffer_;
258
259 DISALLOW_COPY_AND_ASSIGN(SensorEventSinkLight);
260 };
261
225 DataFetcherSharedMemory::DataFetcherSharedMemory() 262 DataFetcherSharedMemory::DataFetcherSharedMemory()
226 : motion_buffer_(nullptr), orientation_buffer_(nullptr) { 263 : motion_buffer_(nullptr),
264 orientation_buffer_(nullptr),
265 light_buffer_(nullptr) {
227 } 266 }
228 267
229 DataFetcherSharedMemory::~DataFetcherSharedMemory() { 268 DataFetcherSharedMemory::~DataFetcherSharedMemory() {
230 } 269 }
231 270
232 DataFetcherSharedMemory::FetcherType DataFetcherSharedMemory::GetType() const { 271 DataFetcherSharedMemory::FetcherType DataFetcherSharedMemory::GetType() const {
233 return FETCHER_TYPE_SEPARATE_THREAD; 272 return FETCHER_TYPE_SEPARATE_THREAD;
234 } 273 }
235 274
236 bool DataFetcherSharedMemory::Start(ConsumerType consumer_type, void* buffer) { 275 bool DataFetcherSharedMemory::Start(ConsumerType consumer_type, void* buffer) {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
270 if (accelerometer_available || gyrometer_available) { 309 if (accelerometer_available || gyrometer_available) {
271 motion_buffer_->seqlock.WriteBegin(); 310 motion_buffer_->seqlock.WriteBegin();
272 motion_buffer_->data.interval = GetInterval().InMilliseconds(); 311 motion_buffer_->data.interval = GetInterval().InMilliseconds();
273 motion_buffer_->seqlock.WriteEnd(); 312 motion_buffer_->seqlock.WriteEnd();
274 return true; 313 return true;
275 } 314 }
276 // if no sensors are available set buffer to ready, to fire null-events. 315 // if no sensors are available set buffer to ready, to fire null-events.
277 SetBufferAvailableState(consumer_type, true); 316 SetBufferAvailableState(consumer_type, true);
278 } 317 }
279 break; 318 break;
319 case CONSUMER_TYPE_LIGHT:
320 {
321 light_buffer_ = static_cast<DeviceLightHardwareBuffer*>(buffer);
322 scoped_refptr<SensorEventSink> sink(
323 new SensorEventSinkLight(light_buffer_));
324 bool sensor_light_available = RegisterForSensor(
325 SENSOR_TYPE_AMBIENT_LIGHT, sensor_light_.Receive(), sink);
326 if (sensor_light_available) {
327 SetLightBuffer(light_buffer_, -1);
328 return true;
329 }
330
331 // if no sensors are available, fire an Infinity event.
332 SetLightBuffer(light_buffer_, std::numeric_limits<double>::infinity());
333 }
334 break;
280 default: 335 default:
281 NOTREACHED(); 336 NOTREACHED();
282 } 337 }
283 return false; 338 return false;
284 } 339 }
285 340
286 bool DataFetcherSharedMemory::Stop(ConsumerType consumer_type) { 341 bool DataFetcherSharedMemory::Stop(ConsumerType consumer_type) {
287 DisableSensors(consumer_type); 342 DisableSensors(consumer_type);
288 SetBufferAvailableState(consumer_type, false); 343 SetBufferAvailableState(consumer_type, false);
289 switch (consumer_type) { 344 switch (consumer_type) {
290 case CONSUMER_TYPE_ORIENTATION: 345 case CONSUMER_TYPE_ORIENTATION:
291 orientation_buffer_ = nullptr; 346 orientation_buffer_ = nullptr;
292 return true; 347 return true;
293 case CONSUMER_TYPE_MOTION: 348 case CONSUMER_TYPE_MOTION:
294 motion_buffer_ = nullptr; 349 motion_buffer_ = nullptr;
295 return true; 350 return true;
351 case CONSUMER_TYPE_LIGHT:
352 SetLightBuffer(light_buffer_, -1);
353 light_buffer_ = nullptr;
354 return true;
296 default: 355 default:
297 NOTREACHED(); 356 NOTREACHED();
298 } 357 }
299 return false; 358 return false;
300 } 359 }
301 360
302 bool DataFetcherSharedMemory::RegisterForSensor( 361 bool DataFetcherSharedMemory::RegisterForSensor(
303 REFSENSOR_TYPE_ID sensor_type, 362 REFSENSOR_TYPE_ID sensor_type,
304 ISensor** sensor, 363 ISensor** sensor,
305 scoped_refptr<SensorEventSink> event_sink) { 364 scoped_refptr<SensorEventSink> event_sink) {
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
361 case CONSUMER_TYPE_MOTION: 420 case CONSUMER_TYPE_MOTION:
362 if (sensor_accelerometer_.get()) { 421 if (sensor_accelerometer_.get()) {
363 sensor_accelerometer_->SetEventSink(nullptr); 422 sensor_accelerometer_->SetEventSink(nullptr);
364 sensor_accelerometer_.Release(); 423 sensor_accelerometer_.Release();
365 } 424 }
366 if (sensor_gyrometer_.get()) { 425 if (sensor_gyrometer_.get()) {
367 sensor_gyrometer_->SetEventSink(nullptr); 426 sensor_gyrometer_->SetEventSink(nullptr);
368 sensor_gyrometer_.Release(); 427 sensor_gyrometer_.Release();
369 } 428 }
370 break; 429 break;
430 case CONSUMER_TYPE_LIGHT:
431 if (sensor_light_.get()) {
432 sensor_light_->SetEventSink(nullptr);
433 sensor_light_.Release();
434 }
435 break;
371 default: 436 default:
372 NOTREACHED(); 437 NOTREACHED();
373 } 438 }
374 } 439 }
375 440
376 void DataFetcherSharedMemory::SetBufferAvailableState( 441 void DataFetcherSharedMemory::SetBufferAvailableState(
377 ConsumerType consumer_type, bool enabled) { 442 ConsumerType consumer_type, bool enabled) {
378 switch(consumer_type) { 443 switch(consumer_type) {
379 case CONSUMER_TYPE_ORIENTATION: 444 case CONSUMER_TYPE_ORIENTATION:
380 if (orientation_buffer_) { 445 if (orientation_buffer_) {
381 orientation_buffer_->seqlock.WriteBegin(); 446 orientation_buffer_->seqlock.WriteBegin();
382 orientation_buffer_->data.allAvailableSensorsAreActive = enabled; 447 orientation_buffer_->data.allAvailableSensorsAreActive = enabled;
383 orientation_buffer_->seqlock.WriteEnd(); 448 orientation_buffer_->seqlock.WriteEnd();
384 } 449 }
385 break; 450 break;
386 case CONSUMER_TYPE_MOTION: 451 case CONSUMER_TYPE_MOTION:
387 if (motion_buffer_) { 452 if (motion_buffer_) {
388 motion_buffer_->seqlock.WriteBegin(); 453 motion_buffer_->seqlock.WriteBegin();
389 motion_buffer_->data.allAvailableSensorsAreActive = enabled; 454 motion_buffer_->data.allAvailableSensorsAreActive = enabled;
390 motion_buffer_->seqlock.WriteEnd(); 455 motion_buffer_->seqlock.WriteEnd();
391 } 456 }
392 break; 457 break;
393 default: 458 default:
394 NOTREACHED(); 459 NOTREACHED();
395 } 460 }
396 } 461 }
397 462
398 } // namespace content 463 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/device_sensors/data_fetcher_shared_memory.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698