| 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> |
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 227 | 227 |
| 228 bool DataFetcherSharedMemory::Start(ConsumerType consumer_type, void* buffer) { | 228 bool DataFetcherSharedMemory::Start(ConsumerType consumer_type, void* buffer) { |
| 229 DCHECK(buffer); | 229 DCHECK(buffer); |
| 230 | 230 |
| 231 switch (consumer_type) { | 231 switch (consumer_type) { |
| 232 case CONSUMER_TYPE_ORIENTATION: { | 232 case CONSUMER_TYPE_ORIENTATION: { |
| 233 orientation_buffer_ = | 233 orientation_buffer_ = |
| 234 static_cast<DeviceOrientationHardwareBuffer*>(buffer); | 234 static_cast<DeviceOrientationHardwareBuffer*>(buffer); |
| 235 scoped_refptr<SensorEventSink> sink( | 235 scoped_refptr<SensorEventSink> sink( |
| 236 new SensorEventSinkOrientation(orientation_buffer_)); | 236 new SensorEventSinkOrientation(orientation_buffer_)); |
| 237 bool inclinometer_available = RegisterForSensor( | 237 bool inclinometer_available = |
| 238 SENSOR_TYPE_INCLINOMETER_3D, sensor_inclinometer_.Receive(), sink); | 238 RegisterForSensor(SENSOR_TYPE_INCLINOMETER_3D, |
| 239 sensor_inclinometer_.GetAddressOf(), sink); |
| 239 UMA_HISTOGRAM_BOOLEAN("InertialSensor.InclinometerWindowsAvailable", | 240 UMA_HISTOGRAM_BOOLEAN("InertialSensor.InclinometerWindowsAvailable", |
| 240 inclinometer_available); | 241 inclinometer_available); |
| 241 if (inclinometer_available) | 242 if (inclinometer_available) |
| 242 return true; | 243 return true; |
| 243 // if no sensors are available set buffer to ready, to fire null-events. | 244 // if no sensors are available set buffer to ready, to fire null-events. |
| 244 SetBufferAvailableState(consumer_type, true); | 245 SetBufferAvailableState(consumer_type, true); |
| 245 } break; | 246 } break; |
| 246 case CONSUMER_TYPE_ORIENTATION_ABSOLUTE: { | 247 case CONSUMER_TYPE_ORIENTATION_ABSOLUTE: { |
| 247 orientation_absolute_buffer_ = | 248 orientation_absolute_buffer_ = |
| 248 static_cast<DeviceOrientationHardwareBuffer*>(buffer); | 249 static_cast<DeviceOrientationHardwareBuffer*>(buffer); |
| 249 scoped_refptr<SensorEventSink> sink( | 250 scoped_refptr<SensorEventSink> sink( |
| 250 new SensorEventSinkOrientation(orientation_absolute_buffer_)); | 251 new SensorEventSinkOrientation(orientation_absolute_buffer_)); |
| 251 // Currently we use the same sensor as for orientation which provides | 252 // Currently we use the same sensor as for orientation which provides |
| 252 // absolute angles. | 253 // absolute angles. |
| 253 bool inclinometer_available = | 254 bool inclinometer_available = |
| 254 RegisterForSensor(SENSOR_TYPE_INCLINOMETER_3D, | 255 RegisterForSensor(SENSOR_TYPE_INCLINOMETER_3D, |
| 255 sensor_inclinometer_absolute_.Receive(), sink); | 256 sensor_inclinometer_absolute_.GetAddressOf(), sink); |
| 256 // TODO(timvolodine): consider adding UMA. | 257 // TODO(timvolodine): consider adding UMA. |
| 257 if (inclinometer_available) | 258 if (inclinometer_available) |
| 258 return true; | 259 return true; |
| 259 // if no sensors are available set buffer to ready, to fire null-events. | 260 // if no sensors are available set buffer to ready, to fire null-events. |
| 260 SetBufferAvailableState(consumer_type, true); | 261 SetBufferAvailableState(consumer_type, true); |
| 261 } break; | 262 } break; |
| 262 case CONSUMER_TYPE_MOTION: { | 263 case CONSUMER_TYPE_MOTION: { |
| 263 motion_buffer_ = static_cast<DeviceMotionHardwareBuffer*>(buffer); | 264 motion_buffer_ = static_cast<DeviceMotionHardwareBuffer*>(buffer); |
| 264 scoped_refptr<SensorEventSink> sink( | 265 scoped_refptr<SensorEventSink> sink( |
| 265 new SensorEventSinkMotion(motion_buffer_)); | 266 new SensorEventSinkMotion(motion_buffer_)); |
| 266 bool accelerometer_available = RegisterForSensor( | 267 bool accelerometer_available = |
| 267 SENSOR_TYPE_ACCELEROMETER_3D, sensor_accelerometer_.Receive(), sink); | 268 RegisterForSensor(SENSOR_TYPE_ACCELEROMETER_3D, |
| 269 sensor_accelerometer_.GetAddressOf(), sink); |
| 268 bool gyrometer_available = RegisterForSensor( | 270 bool gyrometer_available = RegisterForSensor( |
| 269 SENSOR_TYPE_GYROMETER_3D, sensor_gyrometer_.Receive(), sink); | 271 SENSOR_TYPE_GYROMETER_3D, sensor_gyrometer_.GetAddressOf(), sink); |
| 270 UMA_HISTOGRAM_BOOLEAN("InertialSensor.AccelerometerWindowsAvailable", | 272 UMA_HISTOGRAM_BOOLEAN("InertialSensor.AccelerometerWindowsAvailable", |
| 271 accelerometer_available); | 273 accelerometer_available); |
| 272 UMA_HISTOGRAM_BOOLEAN("InertialSensor.GyrometerWindowsAvailable", | 274 UMA_HISTOGRAM_BOOLEAN("InertialSensor.GyrometerWindowsAvailable", |
| 273 gyrometer_available); | 275 gyrometer_available); |
| 274 if (accelerometer_available || gyrometer_available) { | 276 if (accelerometer_available || gyrometer_available) { |
| 275 motion_buffer_->seqlock.WriteBegin(); | 277 motion_buffer_->seqlock.WriteBegin(); |
| 276 motion_buffer_->data.interval = GetInterval().InMilliseconds(); | 278 motion_buffer_->data.interval = GetInterval().InMilliseconds(); |
| 277 motion_buffer_->seqlock.WriteEnd(); | 279 motion_buffer_->seqlock.WriteEnd(); |
| 278 return true; | 280 return true; |
| 279 } | 281 } |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 314 if (base::win::GetVersion() < base::win::VERSION_WIN7) | 316 if (base::win::GetVersion() < base::win::VERSION_WIN7) |
| 315 return false; | 317 return false; |
| 316 | 318 |
| 317 base::win::ScopedComPtr<ISensorManager> sensor_manager; | 319 base::win::ScopedComPtr<ISensorManager> sensor_manager; |
| 318 HRESULT hr = sensor_manager.CreateInstance(CLSID_SensorManager); | 320 HRESULT hr = sensor_manager.CreateInstance(CLSID_SensorManager); |
| 319 if (FAILED(hr) || !sensor_manager.Get()) | 321 if (FAILED(hr) || !sensor_manager.Get()) |
| 320 return false; | 322 return false; |
| 321 | 323 |
| 322 base::win::ScopedComPtr<ISensorCollection> sensor_collection; | 324 base::win::ScopedComPtr<ISensorCollection> sensor_collection; |
| 323 hr = sensor_manager->GetSensorsByType(sensor_type, | 325 hr = sensor_manager->GetSensorsByType(sensor_type, |
| 324 sensor_collection.Receive()); | 326 sensor_collection.GetAddressOf()); |
| 325 | 327 |
| 326 if (FAILED(hr) || !sensor_collection.Get()) | 328 if (FAILED(hr) || !sensor_collection.Get()) |
| 327 return false; | 329 return false; |
| 328 | 330 |
| 329 ULONG count = 0; | 331 ULONG count = 0; |
| 330 hr = sensor_collection->GetCount(&count); | 332 hr = sensor_collection->GetCount(&count); |
| 331 if (FAILED(hr) || !count) | 333 if (FAILED(hr) || !count) |
| 332 return false; | 334 return false; |
| 333 | 335 |
| 334 hr = sensor_collection->GetAt(0, sensor); | 336 hr = sensor_collection->GetAt(0, sensor); |
| 335 if (FAILED(hr) || !(*sensor)) | 337 if (FAILED(hr) || !(*sensor)) |
| 336 return false; | 338 return false; |
| 337 | 339 |
| 338 base::win::ScopedComPtr<IPortableDeviceValues> device_values; | 340 base::win::ScopedComPtr<IPortableDeviceValues> device_values; |
| 339 if (SUCCEEDED(device_values.CreateInstance(CLSID_PortableDeviceValues))) { | 341 if (SUCCEEDED(device_values.CreateInstance(CLSID_PortableDeviceValues))) { |
| 340 if (SUCCEEDED(device_values->SetUnsignedIntegerValue( | 342 if (SUCCEEDED(device_values->SetUnsignedIntegerValue( |
| 341 SENSOR_PROPERTY_CURRENT_REPORT_INTERVAL, | 343 SENSOR_PROPERTY_CURRENT_REPORT_INTERVAL, |
| 342 GetInterval().InMilliseconds()))) { | 344 GetInterval().InMilliseconds()))) { |
| 343 base::win::ScopedComPtr<IPortableDeviceValues> return_values; | 345 base::win::ScopedComPtr<IPortableDeviceValues> return_values; |
| 344 (*sensor)->SetProperties(device_values.Get(), return_values.Receive()); | 346 (*sensor)->SetProperties(device_values.Get(), |
| 347 return_values.GetAddressOf()); |
| 345 } | 348 } |
| 346 } | 349 } |
| 347 | 350 |
| 348 base::win::ScopedComPtr<ISensorEvents> sensor_events; | 351 base::win::ScopedComPtr<ISensorEvents> sensor_events; |
| 349 hr = event_sink->QueryInterface(IID_PPV_ARGS(&sensor_events)); | 352 hr = event_sink->QueryInterface(IID_PPV_ARGS(&sensor_events)); |
| 350 if (FAILED(hr) || !sensor_events.Get()) | 353 if (FAILED(hr) || !sensor_events.Get()) |
| 351 return false; | 354 return false; |
| 352 | 355 |
| 353 hr = (*sensor)->SetEventSink(sensor_events.Get()); | 356 hr = (*sensor)->SetEventSink(sensor_events.Get()); |
| 354 if (FAILED(hr)) | 357 if (FAILED(hr)) |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 411 motion_buffer_->data.all_available_sensors_are_active = enabled; | 414 motion_buffer_->data.all_available_sensors_are_active = enabled; |
| 412 motion_buffer_->seqlock.WriteEnd(); | 415 motion_buffer_->seqlock.WriteEnd(); |
| 413 } | 416 } |
| 414 break; | 417 break; |
| 415 default: | 418 default: |
| 416 NOTREACHED(); | 419 NOTREACHED(); |
| 417 } | 420 } |
| 418 } | 421 } |
| 419 | 422 |
| 420 } // namespace device | 423 } // namespace device |
| OLD | NEW |