OLD | NEW |
(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 |
OLD | NEW |