platform_sensor_provider_linux.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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. #ifndef SERVICES_DEVICE_GENERIC_SENSOR_PLATFORM_SENSOR_PROVIDER_LINUX_H_
  5. #define SERVICES_DEVICE_GENERIC_SENSOR_PLATFORM_SENSOR_PROVIDER_LINUX_H_
  6. #include "services/device/generic_sensor/platform_sensor_provider_linux_base.h"
  7. #include "base/memory/weak_ptr.h"
  8. #include "base/task/sequenced_task_runner.h"
  9. #include "services/device/generic_sensor/linux/sensor_device_manager.h"
  10. namespace device {
  11. struct SensorInfoLinux;
  12. class PlatformSensorProviderLinux : public PlatformSensorProviderLinuxBase,
  13. public SensorDeviceManager::Delegate {
  14. public:
  15. PlatformSensorProviderLinux();
  16. PlatformSensorProviderLinux(const PlatformSensorProviderLinux&) = delete;
  17. PlatformSensorProviderLinux& operator=(const PlatformSensorProviderLinux&) =
  18. delete;
  19. ~PlatformSensorProviderLinux() override;
  20. // Sets another service provided by tests.
  21. void SetSensorDeviceManagerForTesting(
  22. std::unique_ptr<SensorDeviceManager> sensor_device_manager);
  23. protected:
  24. // PlatformSensorProviderLinuxBase overrides:
  25. void CreateSensorInternal(mojom::SensorType type,
  26. SensorReadingSharedBuffer* reading_buffer,
  27. CreateSensorCallback callback) override;
  28. void FreeResources() override;
  29. bool IsSensorTypeAvailable(mojom::SensorType type) const override;
  30. private:
  31. friend class PlatformSensorAndProviderLinuxTest;
  32. // This is also needed for testing, as we create one provider per test, and
  33. // std::unique_ptr needs access to the destructor here.
  34. friend std::unique_ptr<PlatformSensorProviderLinux>::deleter_type;
  35. using SensorDeviceMap =
  36. std::unordered_map<mojom::SensorType, std::unique_ptr<SensorInfoLinux>>;
  37. // Returns SensorInfoLinux structure of a requested type.
  38. // If a request cannot be processed immediately, returns nullptr and
  39. // all the requests stored in |requests_map_| are processed after
  40. // enumeration is ready.
  41. SensorInfoLinux* GetSensorDevice(mojom::SensorType type) const;
  42. // Processed stored requests in |request_map_|.
  43. void ProcessStoredRequests();
  44. // Called when sensors are created asynchronously after enumeration is done.
  45. void CreateSensorAndNotify(mojom::SensorType type,
  46. SensorInfoLinux* sensor_device);
  47. // SensorDeviceManager::Delegate overrides:
  48. void OnSensorNodesEnumerated() override;
  49. void OnDeviceAdded(mojom::SensorType type,
  50. std::unique_ptr<SensorInfoLinux> sensor_device) override;
  51. void OnDeviceRemoved(mojom::SensorType type,
  52. const std::string& device_node) override;
  53. enum class SensorEnumerationState : uint8_t {
  54. // Original state.
  55. kNotEnumerated,
  56. // |sensor_device_manager_| has started to enumerate sensors.
  57. kEnumerationStarted,
  58. // Sensor enumeration has finished.
  59. kEnumerationFinished
  60. } enumeration_status_ = SensorEnumerationState::kNotEnumerated;
  61. // Stores all available sensor devices by type.
  62. SensorDeviceMap sensor_devices_by_type_;
  63. // A task runner that can run blocking tasks. SensorDeviceManager's methods
  64. // run in this task runner, as they need to interact with udev.
  65. scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_;
  66. // This manager is being used to get |SensorInfoLinux|, which represents
  67. // all the information of a concrete sensor provided by OS.
  68. std::unique_ptr<SensorDeviceManager, base::OnTaskRunnerDeleter>
  69. sensor_device_manager_;
  70. base::WeakPtrFactory<PlatformSensorProviderLinux> weak_ptr_factory_{this};
  71. };
  72. } // namespace device
  73. #endif // SERVICES_DEVICE_GENERIC_SENSOR_PLATFORM_SENSOR_PROVIDER_LINUX_H_