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

Unified Diff: device/generic_sensor/platform_sensor_fusion_relative_orientation.cc

Issue 2929603003: Add RELATIVE_ORIENTATION sensor implementation on macOS to //device/generic_sensor (Closed)
Patch Set: updated OnSensorError() Created 3 years, 6 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 side-by-side diff with in-line comments
Download patch
Index: device/generic_sensor/platform_sensor_fusion_relative_orientation.cc
diff --git a/device/generic_sensor/platform_sensor_fusion_relative_orientation.cc b/device/generic_sensor/platform_sensor_fusion_relative_orientation.cc
new file mode 100644
index 0000000000000000000000000000000000000000..9e122cfc3df5ae57e2d756f92141f335716d09ce
--- /dev/null
+++ b/device/generic_sensor/platform_sensor_fusion_relative_orientation.cc
@@ -0,0 +1,137 @@
+// 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_fusion_relative_orientation.h"
+
+#include <stdint.h>
+
+#include <cmath>
+
+#include "base/bind.h"
+#include "base/bind_helpers.h"
+#include "base/memory/ptr_util.h"
+#include "device/generic_sensor/generic_sensor_consts.h"
+#include "device/generic_sensor/platform_sensor_provider.h"
+#include "device/generic_sensor/public/cpp/sensor_shared_buffer_reader.h"
+#include "device/generic_sensor/relative_orientation_fusion_algorithm_using_accelerometer.h"
+
+namespace {
+
+constexpr double kQuaternionThreshold = 0.01;
Mikhail 2017/06/20 13:50:00 where did this value come from?
juncai 2017/06/20 19:50:55 The quaternion is a unit quaternion so I thought 0
timvolodine 2017/06/21 18:22:11 There should be some rational explanation for this
juncai 2017/07/20 00:22:16 In the new CL: https://chromium-review.googlesourc
+
+bool IsSignificantlyDifferent(const device::SensorReading& reading1,
+ const device::SensorReading& reading2) {
+ return (std::fabs(reading1.values[0] - reading2.values[0]) >=
+ kQuaternionThreshold) ||
+ (std::fabs(reading1.values[1] - reading2.values[1]) >=
+ kQuaternionThreshold) ||
+ (std::fabs(reading1.values[2] - reading2.values[2]) >=
+ kQuaternionThreshold);
+}
+
+} // namespace
+
+namespace device {
+
+PlatformSensorFusionRelativeOrientation::
+ PlatformSensorFusionRelativeOrientation(
+ mojo::ScopedSharedBufferMapping mapping,
+ PlatformSensorProvider* provider,
+ const PlatformSensorProviderBase::CreateSensorCallback& callback)
+ : PlatformSensor(mojom::SensorType::RELATIVE_ORIENTATION,
+ std::move(mapping),
+ provider),
+ callback_(callback) {
+ provider->CreateSensor(
Mikhail 2017/06/20 13:50:00 think it's worth first look for existing sensors u
juncai 2017/06/20 19:50:55 Done.
+ mojom::SensorType::ACCELEROMETER,
+ base::Bind(
+ &PlatformSensorFusionRelativeOrientation::CreateAccelerometerCallback,
+ base::Unretained(this)));
+}
+
+PlatformSensorFusionRelativeOrientation::
+ ~PlatformSensorFusionRelativeOrientation() {
+ if (accelerometer_)
+ accelerometer_->RemoveClient(this);
+}
+
+mojom::ReportingMode
+PlatformSensorFusionRelativeOrientation::GetReportingMode() {
+ return accelerometer_->GetReportingMode();
+}
+
+PlatformSensorConfiguration
+PlatformSensorFusionRelativeOrientation::GetDefaultConfiguration() {
+ return PlatformSensorConfiguration(kDefaultAccelerometerFrequencyHz);
Mikhail 2017/06/20 13:50:00 why not use accelerometer_->GetDefaultConfiguratio
juncai 2017/06/20 19:50:55 Done.
+}
+
+bool PlatformSensorFusionRelativeOrientation::StartSensor(
+ const PlatformSensorConfiguration& configuration) {
+ if (!accelerometer_->StartSensor(configuration))
+ return false;
+
+ accelerometer_reader_ = base::MakeUnique<SensorSharedBufferReader>(
Mikhail 2017/06/20 13:50:00 instead of introducing SensorSharedBufferReader I'
juncai 2017/06/20 19:50:55 Done.
+ static_cast<const SensorReadingSharedBuffer*>(
+ accelerometer_->shared_buffer_mapping().get()));
+
+ return true;
+}
+
+void PlatformSensorFusionRelativeOrientation::StopSensor() {
+ accelerometer_->StopSensor();
+}
+
+void PlatformSensorFusionRelativeOrientation::OnSensorReadingChanged() {
+ SensorReading reading;
+ reading.timestamp = (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF();
+
+ if (!accelerometer_reader_->GetSensorReading(&reading))
+ return;
+
+ fusion_algorithm_->set_acceleration(reading.values[0], reading.values[1],
+ reading.values[2]);
+
+ fusion_algorithm_->GetRelativeOrientationData(
+ &reading.values[0].value(), &reading.values[1].value(),
+ &reading.values[2].value(), &reading.values[3].value());
+
+ if (GetReportingMode() == mojom::ReportingMode::ON_CHANGE &&
+ !IsSignificantlyDifferent(reading_, reading)) {
+ return;
+ }
+
+ reading_ = reading;
+ UpdateSensorReading(reading_,
+ GetReportingMode() == mojom::ReportingMode::ON_CHANGE);
+}
+
+void PlatformSensorFusionRelativeOrientation::OnSensorError() {
+ NotifySensorError();
+}
+
+bool PlatformSensorFusionRelativeOrientation::IsNotificationSuspended() {
Mikhail 2017/06/20 13:50:00 think here the suspend status of its own clients s
juncai 2017/06/20 19:50:55 Done.
+ return false;
+}
+
+bool PlatformSensorFusionRelativeOrientation::CheckSensorConfiguration(
+ const PlatformSensorConfiguration& configuration) {
+ return configuration.frequency() > 0 &&
Mikhail 2017/06/20 13:50:00 why not forward this call to the contained "accele
juncai 2017/06/20 19:50:55 Done.
+ configuration.frequency() <=
+ mojom::SensorConfiguration::kMaxAllowedFrequency;
+}
+
+void PlatformSensorFusionRelativeOrientation::CreateAccelerometerCallback(
+ scoped_refptr<PlatformSensor> accelerometer) {
+ accelerometer_ = accelerometer;
+ if (accelerometer_) {
+ accelerometer_->AddClient(this);
+ fusion_algorithm_ = base::MakeUnique<
+ RelativeOrientationFusionAlgorithmUsingAccelerometer>();
+ callback_.Run(scoped_refptr<PlatformSensor>(this));
+ } else {
+ callback_.Run(nullptr);
+ }
+}
+
+} // namespace device

Powered by Google App Engine
This is Rietveld 408576698