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

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: add dcheck 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) {
22 DCHECK(buffer);
23 buffer->seqlock.WriteBegin();
24 buffer->data.value = lux;
25 buffer->seqlock.WriteEnd();
26 }
27
21 } // namespace 28 } // namespace
22 29
23 30
24 namespace content { 31 namespace content {
25 32
26 class DataFetcherSharedMemory::SensorEventSink 33 class DataFetcherSharedMemory::SensorEventSink
27 : public ISensorEvents, public base::win::IUnknownImpl { 34 : public ISensorEvents, public base::win::IUnknownImpl {
28 public: 35 public:
29 SensorEventSink() {} 36 SensorEventSink() {}
30 virtual ~SensorEventSink() {} 37 virtual ~SensorEventSink() {}
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 222
216 return true; 223 return true;
217 } 224 }
218 225
219 private: 226 private:
220 DeviceMotionHardwareBuffer* const buffer_; 227 DeviceMotionHardwareBuffer* const buffer_;
221 228
222 DISALLOW_COPY_AND_ASSIGN(SensorEventSinkMotion); 229 DISALLOW_COPY_AND_ASSIGN(SensorEventSinkMotion);
223 }; 230 };
224 231
232 class DataFetcherSharedMemory::SensorEventSinkLight
233 : public DataFetcherSharedMemory::SensorEventSink {
234 public:
235 explicit SensorEventSinkLight(DeviceLightHardwareBuffer* const buffer)
236 : buffer_(buffer) {}
237 virtual ~SensorEventSinkLight() {}
238
239 protected:
240 virtual bool UpdateSharedMemoryBuffer(ISensor* sensor,
241 ISensorDataReport* new_data) override {
242 double lux;
243 bool has_lux;
244
245 GetSensorValue(SENSOR_DATA_TYPE_LIGHT_LEVEL_LUX, new_data, &lux, &has_lux);
246
247 if(!has_lux) {
248 // Could not get lux value.
249 return false;
250 }
251
252 SetLightBuffer(buffer_, lux);
253
254 return true;
255 }
256
257 private:
258 DeviceLightHardwareBuffer* const buffer_;
259
260 DISALLOW_COPY_AND_ASSIGN(SensorEventSinkLight);
261 };
262
225 DataFetcherSharedMemory::DataFetcherSharedMemory() 263 DataFetcherSharedMemory::DataFetcherSharedMemory()
226 : motion_buffer_(nullptr), orientation_buffer_(nullptr) { 264 : motion_buffer_(nullptr),
265 orientation_buffer_(nullptr),
266 light_buffer_(nullptr) {
227 } 267 }
228 268
229 DataFetcherSharedMemory::~DataFetcherSharedMemory() { 269 DataFetcherSharedMemory::~DataFetcherSharedMemory() {
230 } 270 }
231 271
232 DataFetcherSharedMemory::FetcherType DataFetcherSharedMemory::GetType() const { 272 DataFetcherSharedMemory::FetcherType DataFetcherSharedMemory::GetType() const {
233 return FETCHER_TYPE_SEPARATE_THREAD; 273 return FETCHER_TYPE_SEPARATE_THREAD;
234 } 274 }
235 275
236 bool DataFetcherSharedMemory::Start(ConsumerType consumer_type, void* buffer) { 276 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) { 310 if (accelerometer_available || gyrometer_available) {
271 motion_buffer_->seqlock.WriteBegin(); 311 motion_buffer_->seqlock.WriteBegin();
272 motion_buffer_->data.interval = GetInterval().InMilliseconds(); 312 motion_buffer_->data.interval = GetInterval().InMilliseconds();
273 motion_buffer_->seqlock.WriteEnd(); 313 motion_buffer_->seqlock.WriteEnd();
274 return true; 314 return true;
275 } 315 }
276 // if no sensors are available set buffer to ready, to fire null-events. 316 // if no sensors are available set buffer to ready, to fire null-events.
277 SetBufferAvailableState(consumer_type, true); 317 SetBufferAvailableState(consumer_type, true);
278 } 318 }
279 break; 319 break;
320 case CONSUMER_TYPE_LIGHT:
321 {
322 light_buffer_ = static_cast<DeviceLightHardwareBuffer*>(buffer);
323 scoped_refptr<SensorEventSink> sink(
324 new SensorEventSinkLight(light_buffer_));
325 bool sensor_light_available = RegisterForSensor(
326 SENSOR_TYPE_AMBIENT_LIGHT, sensor_light_.Receive(), sink);
327 if (sensor_light_available) {
328 SetLightBuffer(light_buffer_, -1);
329 return true;
330 }
331
332 // if no sensors are available, fire an Infinity event.
333 SetLightBuffer(light_buffer_, std::numeric_limits<double>::infinity());
334 }
335 break;
280 default: 336 default:
281 NOTREACHED(); 337 NOTREACHED();
282 } 338 }
283 return false; 339 return false;
284 } 340 }
285 341
286 bool DataFetcherSharedMemory::Stop(ConsumerType consumer_type) { 342 bool DataFetcherSharedMemory::Stop(ConsumerType consumer_type) {
287 DisableSensors(consumer_type); 343 DisableSensors(consumer_type);
288 SetBufferAvailableState(consumer_type, false); 344 SetBufferAvailableState(consumer_type, false);
289 switch (consumer_type) { 345 switch (consumer_type) {
290 case CONSUMER_TYPE_ORIENTATION: 346 case CONSUMER_TYPE_ORIENTATION:
291 orientation_buffer_ = nullptr; 347 orientation_buffer_ = nullptr;
292 return true; 348 return true;
293 case CONSUMER_TYPE_MOTION: 349 case CONSUMER_TYPE_MOTION:
294 motion_buffer_ = nullptr; 350 motion_buffer_ = nullptr;
295 return true; 351 return true;
352 case CONSUMER_TYPE_LIGHT:
353 SetLightBuffer(light_buffer_, -1);
354 light_buffer_ = nullptr;
355 return true;
296 default: 356 default:
297 NOTREACHED(); 357 NOTREACHED();
298 } 358 }
299 return false; 359 return false;
300 } 360 }
301 361
302 bool DataFetcherSharedMemory::RegisterForSensor( 362 bool DataFetcherSharedMemory::RegisterForSensor(
303 REFSENSOR_TYPE_ID sensor_type, 363 REFSENSOR_TYPE_ID sensor_type,
304 ISensor** sensor, 364 ISensor** sensor,
305 scoped_refptr<SensorEventSink> event_sink) { 365 scoped_refptr<SensorEventSink> event_sink) {
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
361 case CONSUMER_TYPE_MOTION: 421 case CONSUMER_TYPE_MOTION:
362 if (sensor_accelerometer_.get()) { 422 if (sensor_accelerometer_.get()) {
363 sensor_accelerometer_->SetEventSink(nullptr); 423 sensor_accelerometer_->SetEventSink(nullptr);
364 sensor_accelerometer_.Release(); 424 sensor_accelerometer_.Release();
365 } 425 }
366 if (sensor_gyrometer_.get()) { 426 if (sensor_gyrometer_.get()) {
367 sensor_gyrometer_->SetEventSink(nullptr); 427 sensor_gyrometer_->SetEventSink(nullptr);
368 sensor_gyrometer_.Release(); 428 sensor_gyrometer_.Release();
369 } 429 }
370 break; 430 break;
431 case CONSUMER_TYPE_LIGHT:
432 if (sensor_light_.get()) {
433 sensor_light_->SetEventSink(nullptr);
434 sensor_light_.Release();
435 }
436 break;
371 default: 437 default:
372 NOTREACHED(); 438 NOTREACHED();
373 } 439 }
374 } 440 }
375 441
376 void DataFetcherSharedMemory::SetBufferAvailableState( 442 void DataFetcherSharedMemory::SetBufferAvailableState(
377 ConsumerType consumer_type, bool enabled) { 443 ConsumerType consumer_type, bool enabled) {
378 switch(consumer_type) { 444 switch(consumer_type) {
379 case CONSUMER_TYPE_ORIENTATION: 445 case CONSUMER_TYPE_ORIENTATION:
380 if (orientation_buffer_) { 446 if (orientation_buffer_) {
381 orientation_buffer_->seqlock.WriteBegin(); 447 orientation_buffer_->seqlock.WriteBegin();
382 orientation_buffer_->data.allAvailableSensorsAreActive = enabled; 448 orientation_buffer_->data.allAvailableSensorsAreActive = enabled;
383 orientation_buffer_->seqlock.WriteEnd(); 449 orientation_buffer_->seqlock.WriteEnd();
384 } 450 }
385 break; 451 break;
386 case CONSUMER_TYPE_MOTION: 452 case CONSUMER_TYPE_MOTION:
387 if (motion_buffer_) { 453 if (motion_buffer_) {
388 motion_buffer_->seqlock.WriteBegin(); 454 motion_buffer_->seqlock.WriteBegin();
389 motion_buffer_->data.allAvailableSensorsAreActive = enabled; 455 motion_buffer_->data.allAvailableSensorsAreActive = enabled;
390 motion_buffer_->seqlock.WriteEnd(); 456 motion_buffer_->seqlock.WriteEnd();
391 } 457 }
392 break; 458 break;
393 default: 459 default:
394 NOTREACHED(); 460 NOTREACHED();
395 } 461 }
396 } 462 }
397 463
398 } // namespace content 464 } // 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