Home | History | Annotate | Download | only in sensors
      1 /*
      2  * Copyright (C) 2017 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 #pragma once
     17 
     18 #include <vector>
     19 
     20 #include "common/libs/threads/cuttlefish_thread.h"
     21 #include "common/libs/fs/shared_fd.h"
     22 #include "guest/hals/sensors/sensors.h"
     23 #include "guest/hals/sensors/sensors_hal.h"
     24 
     25 namespace cvd {
     26 
     27 // Used for sending control messages to the receiver thread.
     28 // The sensor_handle field may be left unused if it is not needed.
     29 enum ControlMessageType {
     30   THREAD_STOP,
     31   SENSOR_STATE_UPDATE
     32 };
     33 typedef struct {
     34   ControlMessageType message_type;
     35   uint8_t sensor_handle;
     36 } SensorControlMessage;
     37 
     38 #if VSOC_SENSORS_DEVICE_API_VERSION_ATLEAST(1_0)
     39 // Last updated to HAL 1.4
     40 // Version history:
     41 //   Before jb, jb-mr1 SENSORS_DEVICE_API_VERSION_0_1 (no version in sensors.h)
     42 //   jb-mr2: SENSORS_DEVICE_API_VERSION_1_0
     43 //   k: SENSORS_DEVICE_API_VERSION_1_1
     44 //   l, l-mr1: SENSORS_DEVICE_API_VERSION_1_3
     45 //   m, n, n-mr1: SENSORS_DEVICE_API_VERSION_1_4
     46 #else
     47 // Pre-1.0 sensors do not define the sensors_poll_device_1 type.
     48 typedef sensors_poll_device_t sensors_poll_device_1;
     49 #endif
     50 
     51 class GceSensors : public sensors_poll_device_1 {
     52  public:
     53   GceSensors();
     54   ~GceSensors();
     55 
     56   /**
     57    ** SENSOR HAL API FUNCTIONS FOR MODULE
     58    **/
     59 
     60   // Gets a list of all supported sensors and stores in list.
     61   // Returns the number of supported sensors.
     62   static int GetSensorsList(struct sensors_module_t* module,
     63     struct sensor_t const** list);
     64 
     65   // Place the module in a specific mode. The following modes are defined
     66   //
     67   //  0 - Normal operation. Default state of the module.
     68   //  1 - Loopback mode. Data is injected for the supported
     69   //      sensors by the sensor service in this mode.
     70   // @return 0 on success
     71   //         -EINVAL if requested mode is not supported
     72   //         -EPERM if operation is not allowed
     73   static int SetOperationMode(unsigned int mode);
     74 
     75 
     76   /**
     77    ** SENSOR HAL API FUNCTIONS FOR DEVICE
     78    **/
     79   // Opens the device.
     80   static int Open(const struct hw_module_t* module, const char* name,
     81     struct hw_device_t** device);
     82 
     83   // Closes the device, closing all sensors.
     84   int Close();
     85 
     86   // Activate (or deactivate) the sensor with the given handle.
     87   //
     88   // One-shot sensors deactivate themselves automatically upon receiving an
     89   // event, and they must still accept to be deactivated through a call to
     90   // activate(..., enabled=0).
     91   // Non-wake-up sensors never prevent the SoC from going into suspend mode;
     92   // that is, the HAL shall not hold a partial wake-lock on behalf of
     93   // applications.
     94   //
     95   // If enabled is 1 and the sensor is already activated, this function is a
     96   // no-op and succeeds.
     97   //
     98   // If enabled is 0 and the sensor is already deactivated, this function is a
     99   // no-op and succeeds.
    100   //
    101   // This function returns 0 on success and a negative error number otherwise.
    102   int Activate(int handle, int enabled);
    103 
    104   // Sets the delay (in ns) for the sensor with the given handle.
    105   // Deprecated as of HAL 1.1
    106   // Called after activate()
    107   int SetDelay(int handle, int64_t sampling_period_ns);
    108 
    109   // Returns an array of sensor data by filling the data argument.
    110   // This function must block until events are available. It will return
    111   // the number of events read on success, or a negative number in case of
    112   // an error.
    113   int Poll(sensors_event_t* data, int count);
    114 
    115 #if VSOC_SENSORS_DEVICE_API_VERSION_ATLEAST(1_0)
    116   // Sets a sensors parameters, including sampling frequency and maximum
    117   // report latency. This function can be called while the sensor is
    118   // activated, in which case it must not cause any sensor measurements to
    119   // be lost: transitioning from one sampling rate to the other cannot cause
    120   // lost events, nor can transitioning from a high maximum report latency to
    121   // a low maximum report latency.
    122   //
    123   // Before SENSORS_DEVICE_API_VERSION_1_3, flags included:
    124   //   SENSORS_BATCH_DRY_RUN
    125   //   SENSORS_BATCH_WAKE_UPON_FIFO_FULL
    126   //
    127   // After SENSORS_DEVICE_API_VERSION_1_3 see WAKE_UPON_FIFO_FULL
    128   // in sensor_t.flags
    129   int Batch(int sensor_handle, int flags, int64_t sampling_period_ns,
    130             int64_t max_report_latency_ns) {
    131     // TODO: Add support for maximum report latency with max_report_latency_ns.
    132     return SetDelay(sensor_handle, sampling_period_ns);
    133   }
    134 #endif
    135 
    136 #if VSOC_SENSORS_DEVICE_API_VERSION_ATLEAST(1_1)
    137   // Adds a META_DATA_FLUSH_COMPLETE event (sensors_event_meta_data_t)
    138   // to the end of the "batch mode" FIFO for the specified sensor and flushes
    139   // the FIFO.
    140   //
    141   // If the FIFO is empty or if the sensor doesn't support batching (FIFO
    142   // size zero), it should return SUCCESS along with a trivial
    143   // META_DATA_FLUSH_COMPLETE event added to the event stream. This applies to
    144   // all sensors other than one-shot sensors.
    145   //
    146   // If the sensor is a one-shot sensor, flush must return -EINVAL and not
    147   // generate any flush complete metadata.
    148   //
    149   // If the sensor is not active at the time flush() is called, flush() should
    150   // return -EINVAL.
    151   int Flush(int sensor_handle) {
    152     return -EINVAL;
    153   }
    154 #endif
    155 
    156 #if VSOC_SENSORS_DEVICE_API_VERSION_ATLEAST(1_4)
    157   // Inject a single sensor sample to be to this device.
    158   // data points to the sensor event to be injected
    159   // @return 0 on success
    160   //  -EPERM if operation is not allowed
    161   //  -EINVAL if sensor event cannot be injected
    162   int InjectSensorData(const sensors_event_t *data) {
    163     return -EINVAL;
    164   }
    165 #endif
    166 
    167  private:
    168   typedef std::vector<SensorState*> SensorStateVector;
    169   typedef std::vector<sensors_event_t> FifoType;
    170   // Total number of sensors supported by this HAL.
    171   static int total_sensor_count_;
    172   // Vector of static sensor information for sensors supported by this HAL.
    173   // Indexed by the handle. Length must always be equal to total_sensor_count_.
    174   static SensorInfo* sensor_infos_;
    175   // Vector of sensor state information, indexed by the handle.
    176   // Assumption here is that the sensor handles will start at 0 and be
    177   // contiguous up to the number of supported sensors.
    178   SensorStateVector sensor_states_;
    179   // Keep track of the time when the thread in Poll() is scheduled to wake.
    180   cvd::time::MonotonicTimePoint current_deadline_;
    181 
    182   // Ordered set of sensor values.
    183   // TODO(ghartman): Simulate FIFO overflow.
    184   FifoType fifo_;
    185   // Thread to handle new connections.
    186   pthread_t receiver_thread_;
    187   // Socket to receive sensor events on.
    188   cvd::SharedFD sensor_listener_socket_;
    189   // Socket for listener thread to receive control messages.
    190   cvd::SharedFD control_receiver_socket_;
    191   // Socket to send control messages to listener thread.
    192   cvd::SharedFD control_sender_socket_;
    193 
    194   // Lock to protect shared state, including
    195   // sensor_states_ and next_deadline_.
    196   // Associated with deadline_change_ condition variable.
    197   cvd::Mutex sensor_state_lock_;
    198   // Condition variable to signal changes in the deadline.
    199   cvd::ConditionVariable deadline_change_;
    200 
    201   // When events are arriving from a client, we report only
    202   // when they arrive, rather than at a fixed cycle. After not
    203   // receiving a real event for both a given number of periods
    204   // and a given time period, we will give up and resume
    205   // sending mock events.
    206   const static int kInjectedEventWaitPeriods;
    207   const static cvd::time::Nanoseconds kInjectedEventWaitTime;
    208 
    209   /**
    210    ** UTILITY FUNCTIONS
    211    **/
    212 
    213   // Receive data from remoter.
    214   void* Receiver();
    215 
    216   // Notifies the remoter that the HAL is awake and ready.
    217   inline bool NotifyRemoter();
    218 
    219   // Looks through all active sensor deadlines, and finds the one that
    220   // is coming up next. If this is not next_deadline_, then the deadline
    221   // has changed. Update it and signal the Poll thread.
    222   // This should be called anytime the next deadline may have changed.
    223   // Can only be called while holding sensor_state_lock_.
    224   // Returns true if the deadline has changed.
    225   cvd::time::MonotonicTimePoint UpdateDeadline();
    226 
    227   // Sends an update for the sensor with the given handle to the remoter.
    228   // Update will be enqueued for receiver, not send immediately.
    229   inline bool UpdateRemoterState(int handle);
    230 
    231   // Sends a control event to the listener.
    232   inline bool SendControlMessage(SensorControlMessage msg);
    233 
    234   // Populates the list of static sensor info. Returns the number
    235   // of sensors supported. Should only be called once.
    236   static inline int RegisterSensors();
    237 
    238 };
    239 
    240 } //namespace cvd
    241 
    242