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