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

Unified Diff: device/sensors/mojo/sensor_factory_impl.cc

Issue 2078433002: [sensors] Introduce Generic Sensor API interfaces (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Interfaces + implementation of common part. Created 4 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/sensors/mojo/sensor_factory_impl.cc
diff --git a/device/sensors/mojo/sensor_factory_impl.cc b/device/sensors/mojo/sensor_factory_impl.cc
new file mode 100644
index 0000000000000000000000000000000000000000..3f44ab088fc176cdd1f55503eef27957b84e7321
--- /dev/null
+++ b/device/sensors/mojo/sensor_factory_impl.cc
@@ -0,0 +1,83 @@
+// Copyright 2016 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/sensors/mojo/sensor_factory_impl.h"
+
+#include "device/sensors/mojo/sensor_impl.h"
+#include "device/sensors/mojo/sensor_type_converters.h"
+#include "device/sensors/platform/platform_sensor_provider.h"
+
+namespace device {
+namespace sensors {
+
+namespace {
+const uint64_t kSensorReadingInBytes =
+ kSensorReadingFieldSize * kSensorReadingFieldsCount;
+const uint64_t kSharedBufferSizeInBytes =
+ kSensorReadingInBytes * static_cast<uint64_t>(SensorType::LAST);
+}
+
+PlatformSensorProvider* SensorFactoryImpl::s_provider_ = nullptr;
+
+// static
+void SensorFactoryImpl::Create(mojo::InterfaceRequest<SensorFactory> request) {
+ if (!s_provider_)
+ s_provider_ = PlatformSensorProvider::Create(kSharedBufferSizeInBytes);
+
+ if (s_provider_) {
+ new SensorFactoryImpl(std::move(request));
+ }
+}
+
+SensorFactoryImpl::SensorFactoryImpl(
+ mojo::InterfaceRequest<SensorFactory> request)
+ : binding_(this, std::move(request)) {}
+
+SensorFactoryImpl::~SensorFactoryImpl() {}
+
+namespace {
+
+void ReportError(const SensorFactory::CreateSensorCallback& callback) {
+ callback.Run(Result::FAILURE, mojo::ScopedSharedBufferHandle(), 0, 0,
+ ReportingMode::CONTINUOUS);
+}
+
+uint64_t GetBufferOffset(device::SensorType type) {
+ return (static_cast<uint64_t>(SensorType::LAST) -
+ static_cast<uint64_t>(type)) *
+ kSensorReadingInBytes;
+}
+
+} // namespace
+
+void SensorFactoryImpl::CreateSensor(SensorType type,
+ SensorRequest sensor_request,
+ const CreateSensorCallback& callback) {
+ auto cloned_handle = s_provider_->GetClonedSharedBufferHandle();
+ if (!cloned_handle.is_valid()) {
+ ReportError(callback);
+ return;
+ }
+
+ device::SensorType sensor_type = mojo::ConvertTo<device::SensorType>(type);
+
+ auto sensor = s_provider_->GetSensor(sensor_type);
+ if (!sensor)
+ sensor = s_provider_->CreateSensor(sensor_type, kSensorReadingInBytes,
+ GetBufferOffset(sensor_type));
+ if (!sensor) {
+ ReportError(callback);
+ return;
+ }
+
+ new SensorImpl(std::move(sensor_request), sensor);
+
+ callback.Run(Result::SUCCESS, std::move(cloned_handle),
+ GetBufferOffset(sensor_type), kSensorReadingInBytes,
+ mojo::ConvertTo<device::sensors::ReportingMode>(
+ sensor->GetReportingMode()));
+}
+
+} // namespace sensors
+} // namespace device

Powered by Google App Engine
This is Rietveld 408576698