OLD | NEW |
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 "device/sensors/data_fetcher_shared_memory.h" | 5 #include "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 #include <objbase.h> | 11 #include <objbase.h> |
12 | 12 |
13 #include "base/logging.h" | 13 #include "base/logging.h" |
14 #include "base/macros.h" | 14 #include "base/macros.h" |
15 #include "base/metrics/histogram_macros.h" | 15 #include "base/metrics/histogram_macros.h" |
16 #include "base/win/iunknown_impl.h" | 16 #include "base/win/iunknown_impl.h" |
17 #include "base/win/windows_version.h" | 17 #include "base/win/windows_version.h" |
18 | 18 |
19 namespace { | 19 namespace { |
20 | 20 |
21 const double kMeanGravity = 9.80665; | 21 const double kMeanGravity = 9.80665; |
22 | 22 |
23 void SetLightBuffer(device::DeviceLightHardwareBuffer* buffer, double lux) { | |
24 DCHECK(buffer); | |
25 buffer->seqlock.WriteBegin(); | |
26 buffer->data.value = lux; | |
27 buffer->seqlock.WriteEnd(); | |
28 } | |
29 | |
30 } // namespace | 23 } // namespace |
31 | 24 |
32 namespace device { | 25 namespace device { |
33 | 26 |
34 class DataFetcherSharedMemory::SensorEventSink | 27 class DataFetcherSharedMemory::SensorEventSink |
35 : public ISensorEvents, | 28 : public ISensorEvents, |
36 public base::win::IUnknownImpl { | 29 public base::win::IUnknownImpl { |
37 public: | 30 public: |
38 SensorEventSink() {} | 31 SensorEventSink() {} |
39 ~SensorEventSink() override {} | 32 ~SensorEventSink() override {} |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
217 | 210 |
218 return true; | 211 return true; |
219 } | 212 } |
220 | 213 |
221 private: | 214 private: |
222 DeviceMotionHardwareBuffer* const buffer_; | 215 DeviceMotionHardwareBuffer* const buffer_; |
223 | 216 |
224 DISALLOW_COPY_AND_ASSIGN(SensorEventSinkMotion); | 217 DISALLOW_COPY_AND_ASSIGN(SensorEventSinkMotion); |
225 }; | 218 }; |
226 | 219 |
227 class DataFetcherSharedMemory::SensorEventSinkLight | |
228 : public DataFetcherSharedMemory::SensorEventSink { | |
229 public: | |
230 explicit SensorEventSinkLight(DeviceLightHardwareBuffer* const buffer) | |
231 : buffer_(buffer) {} | |
232 ~SensorEventSinkLight() override {} | |
233 | |
234 protected: | |
235 bool UpdateSharedMemoryBuffer(ISensor* sensor, | |
236 ISensorDataReport* new_data) override { | |
237 double lux; | |
238 bool has_lux; | |
239 | |
240 GetSensorValue(SENSOR_DATA_TYPE_LIGHT_LEVEL_LUX, new_data, &lux, &has_lux); | |
241 | |
242 if (!has_lux) { | |
243 // Could not get lux value. | |
244 return false; | |
245 } | |
246 | |
247 SetLightBuffer(buffer_, lux); | |
248 | |
249 return true; | |
250 } | |
251 | |
252 private: | |
253 DeviceLightHardwareBuffer* const buffer_; | |
254 | |
255 DISALLOW_COPY_AND_ASSIGN(SensorEventSinkLight); | |
256 }; | |
257 | |
258 DataFetcherSharedMemory::DataFetcherSharedMemory() {} | 220 DataFetcherSharedMemory::DataFetcherSharedMemory() {} |
259 | 221 |
260 DataFetcherSharedMemory::~DataFetcherSharedMemory() {} | 222 DataFetcherSharedMemory::~DataFetcherSharedMemory() {} |
261 | 223 |
262 DataFetcherSharedMemory::FetcherType DataFetcherSharedMemory::GetType() const { | 224 DataFetcherSharedMemory::FetcherType DataFetcherSharedMemory::GetType() const { |
263 return FETCHER_TYPE_SEPARATE_THREAD; | 225 return FETCHER_TYPE_SEPARATE_THREAD; |
264 } | 226 } |
265 | 227 |
266 bool DataFetcherSharedMemory::Start(ConsumerType consumer_type, void* buffer) { | 228 bool DataFetcherSharedMemory::Start(ConsumerType consumer_type, void* buffer) { |
267 DCHECK(buffer); | 229 DCHECK(buffer); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
311 gyrometer_available); | 273 gyrometer_available); |
312 if (accelerometer_available || gyrometer_available) { | 274 if (accelerometer_available || gyrometer_available) { |
313 motion_buffer_->seqlock.WriteBegin(); | 275 motion_buffer_->seqlock.WriteBegin(); |
314 motion_buffer_->data.interval = GetInterval().InMilliseconds(); | 276 motion_buffer_->data.interval = GetInterval().InMilliseconds(); |
315 motion_buffer_->seqlock.WriteEnd(); | 277 motion_buffer_->seqlock.WriteEnd(); |
316 return true; | 278 return true; |
317 } | 279 } |
318 // if no sensors are available set buffer to ready, to fire null-events. | 280 // if no sensors are available set buffer to ready, to fire null-events. |
319 SetBufferAvailableState(consumer_type, true); | 281 SetBufferAvailableState(consumer_type, true); |
320 } break; | 282 } break; |
321 case CONSUMER_TYPE_LIGHT: { | |
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 } break; | |
335 default: | 283 default: |
336 NOTREACHED(); | 284 NOTREACHED(); |
337 } | 285 } |
338 return false; | 286 return false; |
339 } | 287 } |
340 | 288 |
341 bool DataFetcherSharedMemory::Stop(ConsumerType consumer_type) { | 289 bool DataFetcherSharedMemory::Stop(ConsumerType consumer_type) { |
342 DisableSensors(consumer_type); | 290 DisableSensors(consumer_type); |
343 switch (consumer_type) { | 291 switch (consumer_type) { |
344 case CONSUMER_TYPE_ORIENTATION: | 292 case CONSUMER_TYPE_ORIENTATION: |
345 SetBufferAvailableState(consumer_type, false); | 293 SetBufferAvailableState(consumer_type, false); |
346 orientation_buffer_ = nullptr; | 294 orientation_buffer_ = nullptr; |
347 return true; | 295 return true; |
348 case CONSUMER_TYPE_ORIENTATION_ABSOLUTE: | 296 case CONSUMER_TYPE_ORIENTATION_ABSOLUTE: |
349 SetBufferAvailableState(consumer_type, false); | 297 SetBufferAvailableState(consumer_type, false); |
350 orientation_absolute_buffer_ = nullptr; | 298 orientation_absolute_buffer_ = nullptr; |
351 return true; | 299 return true; |
352 case CONSUMER_TYPE_MOTION: | 300 case CONSUMER_TYPE_MOTION: |
353 SetBufferAvailableState(consumer_type, false); | 301 SetBufferAvailableState(consumer_type, false); |
354 motion_buffer_ = nullptr; | 302 motion_buffer_ = nullptr; |
355 return true; | 303 return true; |
356 case CONSUMER_TYPE_LIGHT: | |
357 SetLightBuffer(light_buffer_, -1); | |
358 light_buffer_ = nullptr; | |
359 return true; | |
360 default: | 304 default: |
361 NOTREACHED(); | 305 NOTREACHED(); |
362 } | 306 } |
363 return false; | 307 return false; |
364 } | 308 } |
365 | 309 |
366 bool DataFetcherSharedMemory::RegisterForSensor( | 310 bool DataFetcherSharedMemory::RegisterForSensor( |
367 REFSENSOR_TYPE_ID sensor_type, | 311 REFSENSOR_TYPE_ID sensor_type, |
368 ISensor** sensor, | 312 ISensor** sensor, |
369 scoped_refptr<SensorEventSink> event_sink) { | 313 scoped_refptr<SensorEventSink> event_sink) { |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
430 case CONSUMER_TYPE_MOTION: | 374 case CONSUMER_TYPE_MOTION: |
431 if (sensor_accelerometer_.Get()) { | 375 if (sensor_accelerometer_.Get()) { |
432 sensor_accelerometer_->SetEventSink(nullptr); | 376 sensor_accelerometer_->SetEventSink(nullptr); |
433 sensor_accelerometer_.Reset(); | 377 sensor_accelerometer_.Reset(); |
434 } | 378 } |
435 if (sensor_gyrometer_.Get()) { | 379 if (sensor_gyrometer_.Get()) { |
436 sensor_gyrometer_->SetEventSink(nullptr); | 380 sensor_gyrometer_->SetEventSink(nullptr); |
437 sensor_gyrometer_.Reset(); | 381 sensor_gyrometer_.Reset(); |
438 } | 382 } |
439 break; | 383 break; |
440 case CONSUMER_TYPE_LIGHT: | |
441 if (sensor_light_.Get()) { | |
442 sensor_light_->SetEventSink(nullptr); | |
443 sensor_light_.Reset(); | |
444 } | |
445 break; | |
446 default: | 384 default: |
447 NOTREACHED(); | 385 NOTREACHED(); |
448 } | 386 } |
449 } | 387 } |
450 | 388 |
451 void DataFetcherSharedMemory::SetBufferAvailableState( | 389 void DataFetcherSharedMemory::SetBufferAvailableState( |
452 ConsumerType consumer_type, | 390 ConsumerType consumer_type, |
453 bool enabled) { | 391 bool enabled) { |
454 switch (consumer_type) { | 392 switch (consumer_type) { |
455 case CONSUMER_TYPE_ORIENTATION: | 393 case CONSUMER_TYPE_ORIENTATION: |
(...skipping 17 matching lines...) Expand all Loading... |
473 motion_buffer_->data.all_available_sensors_are_active = enabled; | 411 motion_buffer_->data.all_available_sensors_are_active = enabled; |
474 motion_buffer_->seqlock.WriteEnd(); | 412 motion_buffer_->seqlock.WriteEnd(); |
475 } | 413 } |
476 break; | 414 break; |
477 default: | 415 default: |
478 NOTREACHED(); | 416 NOTREACHED(); |
479 } | 417 } |
480 } | 418 } |
481 | 419 |
482 } // namespace device | 420 } // namespace device |
OLD | NEW |