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

Side by Side Diff: third_party/WebKit/Source/modules/sensor/SensorController.cpp

Issue 2051083002: WIP : Generic Sensor API implementation Base URL: https://chromium.googlesource.com/chromium/src.git@lkgr
Patch Set: 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 "modules/sensor/SensorController.h"
6
7 #include "core/frame/LocalFrame.h"
8 #include "platform/mojo/MojoHelper.h"
9 #include "public/platform/ServiceRegistry.h"
10
11 using namespace device::sensors::blink;
12
13 namespace blink {
14
15 SensorController::SensorController(SensorType sensorType, SensorProvider* provid er)
16 : m_type(sensorType)
17 , m_mode(ReportingMode::CONTINUOUS)
18 , m_provider(provider)
19 , m_clientBinding(this)
20 , m_state(SensorController::Uninitialized)
21 , m_sharedBuffer(nullptr)
22 {
23 }
24
25 SensorController::~SensorController()
26 {
27 }
28
29 void SensorController::dispose()
30 {
31 m_clientBinding.Close();
32 }
33
34 DEFINE_TRACE(SensorController)
35 {
36 visitor->trace(m_observers);
37 visitor->trace(m_provider);
38 }
39
40 void SensorController::addObserver(Observer* observer)
41 {
42 if (!m_observers.contains(observer))
43 m_observers.add(observer);
44 }
45
46 void SensorController::removeObserver(Observer* observer) {
47 if (m_observers.contains(observer))
48 m_observers.remove(observer);
49
50 if (m_observers.isEmpty()) {
51 m_provider->removeSensor(this);
52 }
53 }
54
55 void SensorController::initialize()
56 {
57 if (m_state != Uninitialized)
58 return;
59 m_state = Initializing;
60
61 auto callback = createBaseCallback(bind<Result, mojo::ScopedSharedBufferHand le, uint64_t, uint64_t, ReportingMode>(&SensorController::onSensorCreated, WeakP ersistentThisPointer<SensorController>(this)));
62 m_provider->sensorFactory()->CreateSensor(m_type, mojo::GetProxy(&m_sensor), callback);
63 }
64
65 void SensorController::startConfiguration(SensorConfigurationPtr configuration, std::unique_ptr<Function<void(bool)>> callback)
66 {
67 ASSERT(isInitialized());
68 m_sensor->Start(std::move(configuration), createBaseCallback(std::move(callb ack)));
69 }
70
71 void SensorController::stopConfiguration(SensorConfigurationPtr configuration, s td::unique_ptr<Function<void(bool)>> callback)
72 {
73 ASSERT(isInitialized());
74 m_sensor->Stop(std::move(configuration), createBaseCallback(std::move(callba ck)));
75 }
76
77 void SensorController::OnSensorError()
78 {
79 handleSensorError();
80 }
81
82 void SensorController::OnSensorReadingChanged()
83 {
84 for (Observer* observer : m_observers)
85 {
86 if (observer)
87 observer->onSensorReadingChanged();
88 }
89 }
90
91 void SensorController::handleSensorError()
92 {
93 m_state = Uninitialized;
94
95 HeapHashSet<WeakMember<Observer>> observersCopy(m_observers);
96 for (Observer* observer : observersCopy)
97 {
98 if (observer)
99 observer->onSensorError();
100 }
101
102 m_observers.clear();
103 m_provider->removeSensor(this);
104 }
105
106 void SensorController::onSensorCreated(Result result, mojo::ScopedSharedBufferHa ndle handle, uint64_t offset, uint64_t size, ReportingMode mode) {
107 if (result != Result::SUCCESS)
108 {
109 handleSensorError();
110 return;
111 }
112
113 if (size != sBufferSize || (offset % sBufferSize) != 0)
114 {
115 ASSERT_NOT_REACHED();
116 handleSensorError();
117 return;
118 }
119
120 m_mode = mode;
121
122 m_sensor->SetClient(m_clientBinding.CreateInterfacePtrAndBind());
123 m_sensor.set_connection_error_handler(createBaseCallback(bind(&SensorControl ler::handleSensorError, WeakPersistentThisPointer<SensorController>(this))));
124
125 ASSERT(!m_sharedBuffer);
126
127 MojoResult mapResult = mojo::MapBuffer(handle.get(), offset, size, &m_shared Buffer, MOJO_MAP_BUFFER_FLAG_NONE);
128 if (mapResult != MOJO_RESULT_OK || !m_sharedBuffer)
129 {
130 //WTFLogAlways("map has failed %llu %llu. \n", offset, size);
131 handleSensorError();
132 return;
133 }
134
135 m_sharedBufferHandle = std::move(handle);
136 m_state = Initialized;
137
138 HeapHashSet<WeakMember<Observer>> observersCopy(m_observers);
139 for (Observer* observer : observersCopy) {
140 if (observer)
141 observer->onSensorInitialized();
142 }
143 }
144
145
146 // SensorProvider
147 SensorProvider::SensorProvider(LocalFrame& frame)
148 : LocalFrameLifecycleObserver(&frame)
149 {
150 frame.serviceRegistry()->connectToRemoteService(mojo::GetProxy(&m_sensorFact ory));
151 m_sensorFactory.set_connection_error_handler(createBaseCallback(bind(&Sensor Provider::handleSensorError, WeakPersistentThisPointer<SensorProvider>(this))));
152 }
153
154 SensorProvider* SensorProvider::getOrCreateForFrame(LocalFrame& frame)
155 {
156 SensorProvider* result = static_cast<SensorProvider*>(Supplement<LocalFrame> ::from(frame, s_supplementKey));
157 if (!result) {
158 result = new SensorProvider(frame);
159 Supplement<LocalFrame>::provideTo(frame, s_supplementKey, result);
160 }
161 return result;
162 }
163
164 SensorProvider::~SensorProvider()
165 {
166 }
167
168 DEFINE_TRACE(SensorProvider)
169 {
170 visitor->trace(m_sensors);
171 Supplement<LocalFrame>::trace(visitor);
172 LocalFrameLifecycleObserver::trace(visitor);
173 }
174
175 void SensorProvider::removeSensor(SensorController* controller)
176 {
177 auto it = std::find(m_sensors.begin(), m_sensors.end(), controller);
178 if (it != m_sensors.end())
179 return m_sensors.remove(std::distance(m_sensors.begin(), it));
180 }
181
182 SensorController* SensorProvider::getOrCreateSensor(device::sensors::blink::Sens orType type)
183 {
184 auto it = std::find_if(m_sensors.begin(), m_sensors.end(), [type] (SensorCon troller* s) { return s->type() == type; });
185 if (it != m_sensors.end())
186 return *it;
187 SensorController* result = new SensorController(type, this);
188 m_sensors.append(result);
189
190 return result;
191 }
192
193 void SensorProvider::handleSensorError()
194 {
195 HeapVector<Member<SensorController>> sensorsCopy(m_sensors);
196 for (SensorController* sensor : sensorsCopy) {
197 // All sensors are invalidated.
198 sensor->handleSensorError();
199 }
200 frame()->removeSupplement(s_supplementKey);
201 }
202
203 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698