Index: device/generic_sensor/platform_sensor_accelerometer_mac.cc |
diff --git a/device/generic_sensor/platform_sensor_accelerometer_mac.cc b/device/generic_sensor/platform_sensor_accelerometer_mac.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..19a7f2969ef1c10393ecdf9c0032fbd7d1583282 |
--- /dev/null |
+++ b/device/generic_sensor/platform_sensor_accelerometer_mac.cc |
@@ -0,0 +1,103 @@ |
+// Copyright 2017 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "device/generic_sensor/platform_sensor_accelerometer_mac.h" |
+ |
+#include <stdint.h> |
+ |
+#include <cmath> |
+ |
+#include "base/bind.h" |
+#include "device/base/synchronization/shared_memory_seqlock_buffer.h" |
+#include "device/generic_sensor/generic_sensor_consts.h" |
+#include "device/generic_sensor/platform_sensor_provider_mac.h" |
+#include "third_party/sudden_motion_sensor/sudden_motion_sensor_mac.h" |
+ |
+namespace { |
+ |
+constexpr double kMeanGravity = 9.80665; |
+ |
+constexpr double kGravityThreshold = kMeanGravity * 0.01; |
+ |
+bool IsSignificantlyDifferent(const device::SensorReading& reading1, |
+ const device::SensorReading& reading2) { |
+ return (std::fabs(reading1.values[0] - reading2.values[0]) >= |
+ kGravityThreshold) || |
+ (std::fabs(reading1.values[1] - reading2.values[1]) >= |
+ kGravityThreshold) || |
+ (std::fabs(reading1.values[2] - reading2.values[2]) >= |
+ kGravityThreshold); |
+} |
+ |
+} // namespace |
+ |
+namespace device { |
+ |
+PlatformSensorAccelerometerMac::PlatformSensorAccelerometerMac( |
+ mojo::ScopedSharedBufferMapping mapping, |
+ PlatformSensorProvider* provider) |
+ : PlatformSensor(mojom::SensorType::ACCELEROMETER, |
+ std::move(mapping), |
+ provider), |
+ sudden_motion_sensor_(SuddenMotionSensor::Create()) {} |
+ |
+PlatformSensorAccelerometerMac::~PlatformSensorAccelerometerMac() = default; |
+ |
+mojom::ReportingMode PlatformSensorAccelerometerMac::GetReportingMode() { |
+ return mojom::ReportingMode::ON_CHANGE; |
+} |
+ |
+bool PlatformSensorAccelerometerMac::CheckSensorConfiguration( |
+ const PlatformSensorConfiguration& configuration) { |
+ return configuration.frequency() > 0 && |
+ configuration.frequency() <= |
+ mojom::SensorConfiguration::kMaxAllowedFrequency; |
+} |
+ |
+PlatformSensorConfiguration |
+PlatformSensorAccelerometerMac::GetDefaultConfiguration() { |
+ return PlatformSensorConfiguration(kDefaultAccelerometerFrequencyHz); |
+} |
+ |
+bool PlatformSensorAccelerometerMac::StartSensor( |
+ const PlatformSensorConfiguration& configuration) { |
+ if (!sudden_motion_sensor_) |
+ return false; |
+ |
+ float axis_value[3]; |
+ if (!sudden_motion_sensor_->ReadSensorValues(axis_value)) |
+ return false; |
+ |
+ timer_.Start( |
+ FROM_HERE, |
+ base::TimeDelta::FromMicroseconds(base::Time::kMicrosecondsPerSecond / |
+ configuration.frequency()), |
+ this, &PlatformSensorAccelerometerMac::PollForData); |
+ |
+ return true; |
+} |
+ |
+void PlatformSensorAccelerometerMac::StopSensor() { |
+ timer_.Stop(); |
+} |
+ |
+void PlatformSensorAccelerometerMac::PollForData() { |
+ // Retrieve per-axis calibrated values. |
+ float axis_value[3]; |
+ if (!sudden_motion_sensor_->ReadSensorValues(axis_value)) |
+ return; |
+ |
+ SensorReading reading; |
+ reading.timestamp = (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); |
+ reading.values[0] = axis_value[0] * kMeanGravity; |
+ reading.values[1] = axis_value[1] * kMeanGravity; |
+ reading.values[2] = axis_value[2] * kMeanGravity; |
+ |
+ if (IsSignificantlyDifferent(reading_, reading)) { |
+ reading_ = reading; |
+ UpdateSensorReading(reading, true); |
+ } |
+} |
+ |
+} // namespace device |