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

Side by Side 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "device/sensors/mojo/sensor_factory_impl.h"
6
7 #include "device/sensors/mojo/sensor_impl.h"
8 #include "device/sensors/mojo/sensor_type_converters.h"
9 #include "device/sensors/platform/platform_sensor_provider.h"
10
11 namespace device {
12 namespace sensors {
13
14 namespace {
15 const uint64_t kSensorReadingInBytes =
16 kSensorReadingFieldSize * kSensorReadingFieldsCount;
17 const uint64_t kSharedBufferSizeInBytes =
18 kSensorReadingInBytes * static_cast<uint64_t>(SensorType::LAST);
19 }
20
21 PlatformSensorProvider* SensorFactoryImpl::s_provider_ = nullptr;
22
23 // static
24 void SensorFactoryImpl::Create(mojo::InterfaceRequest<SensorFactory> request) {
25 if (!s_provider_)
26 s_provider_ = PlatformSensorProvider::Create(kSharedBufferSizeInBytes);
27
28 if (s_provider_) {
29 new SensorFactoryImpl(std::move(request));
30 }
31 }
32
33 SensorFactoryImpl::SensorFactoryImpl(
34 mojo::InterfaceRequest<SensorFactory> request)
35 : binding_(this, std::move(request)) {}
36
37 SensorFactoryImpl::~SensorFactoryImpl() {}
38
39 namespace {
40
41 void ReportError(const SensorFactory::CreateSensorCallback& callback) {
42 callback.Run(Result::FAILURE, mojo::ScopedSharedBufferHandle(), 0, 0,
43 ReportingMode::CONTINUOUS);
44 }
45
46 uint64_t GetBufferOffset(device::SensorType type) {
47 return (static_cast<uint64_t>(SensorType::LAST) -
48 static_cast<uint64_t>(type)) *
49 kSensorReadingInBytes;
50 }
51
52 } // namespace
53
54 void SensorFactoryImpl::CreateSensor(SensorType type,
55 SensorRequest sensor_request,
56 const CreateSensorCallback& callback) {
57 auto cloned_handle = s_provider_->GetClonedSharedBufferHandle();
58 if (!cloned_handle.is_valid()) {
59 ReportError(callback);
60 return;
61 }
62
63 device::SensorType sensor_type = mojo::ConvertTo<device::SensorType>(type);
64
65 auto sensor = s_provider_->GetSensor(sensor_type);
66 if (!sensor)
67 sensor = s_provider_->CreateSensor(sensor_type, kSensorReadingInBytes,
68 GetBufferOffset(sensor_type));
69 if (!sensor) {
70 ReportError(callback);
71 return;
72 }
73
74 new SensorImpl(std::move(sensor_request), sensor);
75
76 callback.Run(Result::SUCCESS, std::move(cloned_handle),
77 GetBufferOffset(sensor_type), kSensorReadingInBytes,
78 mojo::ConvertTo<device::sensors::ReportingMode>(
79 sensor->GetReportingMode()));
80 }
81
82 } // namespace sensors
83 } // namespace device
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698