1 // Copyright 2014 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 #ifndef ASH_ACCELEROMETER_ACCELEROMETER_READER_H_ 6 #define ASH_ACCELEROMETER_ACCELEROMETER_READER_H_ 7 8 #include "ash/accelerometer/accelerometer_types.h" 9 #include "ash/ash_export.h" 10 #include "base/macros.h" 11 #include "base/memory/ref_counted.h" 12 13 namespace base { 14 template <typename T> 15 struct DefaultSingletonTraits; 16 17 class SequencedTaskRunner; 18 } // namespace base 19 20 namespace ash { 21 22 enum class ECLidAngleDriverStatus { UNKNOWN, SUPPORTED, NOT_SUPPORTED }; 23 24 class AccelerometerProviderInterface; 25 26 // Reads an accelerometer device and reports data back to an 27 // AccelerometerDelegate. 28 class ASH_EXPORT AccelerometerReader { 29 public: 30 // An interface to receive data from the AccelerometerReader. 31 class Observer { 32 public: 33 virtual void OnAccelerometerUpdated( 34 scoped_refptr<const AccelerometerUpdate> update) = 0; 35 36 protected: ~Observer()37 virtual ~Observer() {} 38 }; 39 40 static AccelerometerReader* GetInstance(); 41 42 void Initialize( 43 scoped_refptr<base::SequencedTaskRunner> sequenced_task_runner); 44 45 // Add/Remove observers. 46 void AddObserver(Observer* observer); 47 void RemoveObserver(Observer* observer); 48 49 // Accelerometer file reader starts/stops listening to tablet mode controller. 50 void StartListenToTabletModeController(); 51 void StopListenToTabletModeController(); 52 53 // Controls the availability of emitting acccelerometer reader events to 54 // its observers. This shouldn't be called normally, but Tast tests should 55 // be able to control the accelerometer feature. 56 void SetEnabled(bool enabled); 57 58 // Return the state of the driver being supported or not. 59 ECLidAngleDriverStatus GetECLidAngleDriverStatus() const; 60 61 void SetECLidAngleDriverStatusForTesting( 62 ECLidAngleDriverStatus ec_lid_angle_driver_status); 63 64 protected: 65 AccelerometerReader(); 66 AccelerometerReader(const AccelerometerReader&) = delete; 67 AccelerometerReader& operator=(const AccelerometerReader&) = delete; 68 virtual ~AccelerometerReader(); 69 70 private: 71 friend struct base::DefaultSingletonTraits<AccelerometerReader>; 72 73 // Worker that will run on the base::SequencedTaskRunner provided to 74 // Initialize. It will determine accelerometer configuration, read the data, 75 // and notify observers. 76 scoped_refptr<AccelerometerProviderInterface> accelerometer_provider_; 77 }; 78 79 class AccelerometerProviderInterface 80 : public base::RefCountedThreadSafe<AccelerometerProviderInterface> { 81 public: 82 // Prepare and start async initialization. SetSensorClient function 83 // contains actual code for initialization. 84 virtual void PrepareAndInitialize( 85 scoped_refptr<base::SequencedTaskRunner> sequenced_task_runner) = 0; 86 87 // Add/Remove observers. 88 virtual void AddObserver(AccelerometerReader::Observer* observer) = 0; 89 virtual void RemoveObserver(AccelerometerReader::Observer* observer) = 0; 90 91 // Start/Stop listening to tablet mode controller. 92 virtual void StartListenToTabletModeController() = 0; 93 virtual void StopListenToTabletModeController() = 0; 94 95 // Set emitting events (samples) to observers or not. 96 virtual void SetEmitEvents(bool emit_events) = 0; 97 98 // Return the state of the driver being supported or not. 99 ECLidAngleDriverStatus GetECLidAngleDriverStatus() const; 100 101 void SetECLidAngleDriverStatusForTesting( 102 ECLidAngleDriverStatus ec_lid_angle_driver_status); 103 104 protected: 105 virtual ~AccelerometerProviderInterface() = default; 106 107 // State of ChromeOS EC lid angle driver, if SUPPORTED, it means EC can handle 108 // lid angle calculation. 109 ECLidAngleDriverStatus ec_lid_angle_driver_status_ = 110 ECLidAngleDriverStatus::UNKNOWN; 111 112 private: 113 friend class base::RefCountedThreadSafe<AccelerometerProviderInterface>; 114 }; 115 116 } // namespace ash 117 118 #endif // ASH_ACCELEROMETER_ACCELEROMETER_READER_H_ 119