11795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol/* 21795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol * Copyright (C) 2016 The Android Open Source Project 31795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol * 41795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol * Licensed under the Apache License, Version 2.0 (the "License"); 51795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol * you may not use this file except in compliance with the License. 61795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol * You may obtain a copy of the License at 71795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol * 81795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol * http://www.apache.org/licenses/LICENSE-2.0 91795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol * 101795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol * Unless required by applicable law or agreed to in writing, software 111795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol * distributed under the License is distributed on an "AS IS" BASIS, 121795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol * See the License for the specific language governing permissions and 141795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol * limitations under the License. 151795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol */ 161795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol 171795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol#ifndef CHRE_CORE_SENSOR_REQUEST_MANAGER_H_ 181795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol#define CHRE_CORE_SENSOR_REQUEST_MANAGER_H_ 191795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol 201795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol#include "chre/core/request_multiplexer.h" 21cb8312e5ce53430576e2343e4863af84676c93adAndrew Rossignol#include "chre/core/sensor.h" 224446be9be8f90e66d3cb4d30393862fc725230daAndrew Rossignol#include "chre/core/sensor_request.h" 231795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol#include "chre/util/fixed_size_vector.h" 241795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol#include "chre/util/non_copyable.h" 251795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol#include "chre/util/optional.h" 261795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol 271795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignolnamespace chre { 281795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol 291795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignolclass SensorRequestManager : public NonCopyable { 301795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol public: 311795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol /** 321795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol * Performs initialization of the SensorRequestManager and populates the 331795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol * sensor list with platform sensors. 341795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol */ 351795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol SensorRequestManager(); 361795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol 371795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol /** 381795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol * Destructs the sensor request manager and releases platform sensor resources 391795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol * if requested. 401795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol */ 411795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol ~SensorRequestManager(); 421795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol 431795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol /** 441795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol * Determines whether the runtime is aware of a given sensor type. The 451795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol * supplied sensorHandle is only populated if the sensor type is known. 461795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol * 471795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol * @param sensorType The type of the sensor. 481795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol * @param sensorHandle A non-null pointer to a uint32_t to use as a sensor 491795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol * handle for nanoapps. 501795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol * @return true if the supplied sensor type is available for use. 511795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol */ 521795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol bool getSensorHandle(SensorType sensorType, uint32_t *sensorHandle) const; 531795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol 548d7fbecab6b025243dcdb6dc28f49e37430dc650Andrew Rossignol /** 558d7fbecab6b025243dcdb6dc28f49e37430dc650Andrew Rossignol * Sets a sensor request for the given nanoapp for the provided sensor handle. 568d7fbecab6b025243dcdb6dc28f49e37430dc650Andrew Rossignol * If the nanoapp has made a previous request, it is replaced by this request. 578d7fbecab6b025243dcdb6dc28f49e37430dc650Andrew Rossignol * If the request changes the mode to SensorMode::Off the request is removed. 588d7fbecab6b025243dcdb6dc28f49e37430dc650Andrew Rossignol * 598d7fbecab6b025243dcdb6dc28f49e37430dc650Andrew Rossignol * @param nanoapp A non-null pointer to the nanoapp requesting this change. 608d7fbecab6b025243dcdb6dc28f49e37430dc650Andrew Rossignol * @param sensorHandle The sensor handle for which this sensor request is 618d7fbecab6b025243dcdb6dc28f49e37430dc650Andrew Rossignol * directed at. 628d7fbecab6b025243dcdb6dc28f49e37430dc650Andrew Rossignol * @param request The new sensor request for this nanoapp. 638d7fbecab6b025243dcdb6dc28f49e37430dc650Andrew Rossignol * @return true if the request was set successfully. If the sensorHandle is 648d7fbecab6b025243dcdb6dc28f49e37430dc650Andrew Rossignol * out of range or the platform sensor fails to update to the new 658d7fbecab6b025243dcdb6dc28f49e37430dc650Andrew Rossignol * request false will be returned. 668d7fbecab6b025243dcdb6dc28f49e37430dc650Andrew Rossignol */ 678d7fbecab6b025243dcdb6dc28f49e37430dc650Andrew Rossignol bool setSensorRequest(Nanoapp *nanoapp, uint32_t sensorHandle, 688d7fbecab6b025243dcdb6dc28f49e37430dc650Andrew Rossignol const SensorRequest& sensorRequest); 698d7fbecab6b025243dcdb6dc28f49e37430dc650Andrew Rossignol 7048fda6e1eedf6ba80ae7596fc7676f8318a1e88eMeng-hsuan Chung /** 7148fda6e1eedf6ba80ae7596fc7676f8318a1e88eMeng-hsuan Chung * Populates the supplied info struct if the sensor handle exists. 7248fda6e1eedf6ba80ae7596fc7676f8318a1e88eMeng-hsuan Chung * 7348fda6e1eedf6ba80ae7596fc7676f8318a1e88eMeng-hsuan Chung * @param sensorHandle The handle of the sensor. 7453cec69ff23e5ffabf9f29d824c14fbdb18dc856Brian Duddie * @param nanoapp The nanoapp requesting this change. 7548fda6e1eedf6ba80ae7596fc7676f8318a1e88eMeng-hsuan Chung * @param info A non-null pointer to a chreSensorInfo struct. 7648fda6e1eedf6ba80ae7596fc7676f8318a1e88eMeng-hsuan Chung * @return true if the supplied sensor handle exists. 7748fda6e1eedf6ba80ae7596fc7676f8318a1e88eMeng-hsuan Chung */ 7853cec69ff23e5ffabf9f29d824c14fbdb18dc856Brian Duddie bool getSensorInfo(uint32_t sensorHandle, const Nanoapp& nanoapp, 7948fda6e1eedf6ba80ae7596fc7676f8318a1e88eMeng-hsuan Chung struct chreSensorInfo *info) const; 80cea64a899fafc0e75dc0e63dbe699ca5679564adMeng-hsuan Chung /* 81cea64a899fafc0e75dc0e63dbe699ca5679564adMeng-hsuan Chung * Removes all requests of a sensorType and unregisters all nanoapps for its 82cea64a899fafc0e75dc0e63dbe699ca5679564adMeng-hsuan Chung * events. 83cea64a899fafc0e75dc0e63dbe699ca5679564adMeng-hsuan Chung * 84cea64a899fafc0e75dc0e63dbe699ca5679564adMeng-hsuan Chung * @param sensorType The sensor type whose requests are to be removed. 85cea64a899fafc0e75dc0e63dbe699ca5679564adMeng-hsuan Chung * @return true if all requests of the sensor type have been successfully 86cea64a899fafc0e75dc0e63dbe699ca5679564adMeng-hsuan Chung * removed. 87cea64a899fafc0e75dc0e63dbe699ca5679564adMeng-hsuan Chung */ 88cea64a899fafc0e75dc0e63dbe699ca5679564adMeng-hsuan Chung bool removeAllRequests(SensorType sensorType); 8948fda6e1eedf6ba80ae7596fc7676f8318a1e88eMeng-hsuan Chung 9067de3f239af66c0d5733950a916bc5566f2017f0Meng-hsuan Chung /** 9167de3f239af66c0d5733950a916bc5566f2017f0Meng-hsuan Chung * Obtains a pointer to the Sensor of the specified sensorType. 9267de3f239af66c0d5733950a916bc5566f2017f0Meng-hsuan Chung * 9367de3f239af66c0d5733950a916bc5566f2017f0Meng-hsuan Chung * @param sensorType The SensorType of the sensor. 9453cec69ff23e5ffabf9f29d824c14fbdb18dc856Brian Duddie * @return A pointer to the Sensor of sensorType, or nullptr if sensorType is 9553cec69ff23e5ffabf9f29d824c14fbdb18dc856Brian Duddie * invalid or the requested SensorType is not supported on the current 9653cec69ff23e5ffabf9f29d824c14fbdb18dc856Brian Duddie * platform. 9767de3f239af66c0d5733950a916bc5566f2017f0Meng-hsuan Chung */ 9867de3f239af66c0d5733950a916bc5566f2017f0Meng-hsuan Chung Sensor *getSensor(SensorType sensorType); 9967de3f239af66c0d5733950a916bc5566f2017f0Meng-hsuan Chung 10059e4cbe02c3dbfd3375dd39ac2691065c813353bMeng-hsuan Chung /** 10159e4cbe02c3dbfd3375dd39ac2691065c813353bMeng-hsuan Chung * Populates the supplied sampling status struct if the sensor handle exists. 10259e4cbe02c3dbfd3375dd39ac2691065c813353bMeng-hsuan Chung * 10359e4cbe02c3dbfd3375dd39ac2691065c813353bMeng-hsuan Chung * @param sensorHandle The handle of the sensor. 10459e4cbe02c3dbfd3375dd39ac2691065c813353bMeng-hsuan Chung * @param status A non-null pointer to a chreSensorSamplingStatus struct. 10559e4cbe02c3dbfd3375dd39ac2691065c813353bMeng-hsuan Chung * @return true if the supplied sensor handle exists. 10659e4cbe02c3dbfd3375dd39ac2691065c813353bMeng-hsuan Chung */ 10759e4cbe02c3dbfd3375dd39ac2691065c813353bMeng-hsuan Chung bool getSensorSamplingStatus(uint32_t sensorHandle, 10859e4cbe02c3dbfd3375dd39ac2691065c813353bMeng-hsuan Chung struct chreSensorSamplingStatus *status) const; 10959e4cbe02c3dbfd3375dd39ac2691065c813353bMeng-hsuan Chung 11086bb62ca9e700b72f182d2473300a6accd9c4818Meng-hsuan Chung /** 11186bb62ca9e700b72f182d2473300a6accd9c4818Meng-hsuan Chung * Obtains the list of open requests of the specified SensorType. 11286bb62ca9e700b72f182d2473300a6accd9c4818Meng-hsuan Chung * 11386bb62ca9e700b72f182d2473300a6accd9c4818Meng-hsuan Chung * @param sensorType The SensorType of the sensor. 11486bb62ca9e700b72f182d2473300a6accd9c4818Meng-hsuan Chung * @return The list of open requests of this sensor in a DynamicVector. 11586bb62ca9e700b72f182d2473300a6accd9c4818Meng-hsuan Chung */ 11686bb62ca9e700b72f182d2473300a6accd9c4818Meng-hsuan Chung const DynamicVector<SensorRequest>& getRequests(SensorType sensorType) const; 11786bb62ca9e700b72f182d2473300a6accd9c4818Meng-hsuan Chung 118d0530f420d8bdaee755ec2834af407424de195e0Arthur Ishiguro /** 119d0530f420d8bdaee755ec2834af407424de195e0Arthur Ishiguro * Prints state in a string buffer. Must only be called from the context of 120d0530f420d8bdaee755ec2834af407424de195e0Arthur Ishiguro * the main CHRE thread. 121d0530f420d8bdaee755ec2834af407424de195e0Arthur Ishiguro * 122d0530f420d8bdaee755ec2834af407424de195e0Arthur Ishiguro * @param buffer Pointer to the start of the buffer. 123d0530f420d8bdaee755ec2834af407424de195e0Arthur Ishiguro * @param bufferPos Pointer to buffer position to start the print (in-out). 124d0530f420d8bdaee755ec2834af407424de195e0Arthur Ishiguro * @param size Size of the buffer in bytes. 125d0530f420d8bdaee755ec2834af407424de195e0Arthur Ishiguro * 126d0530f420d8bdaee755ec2834af407424de195e0Arthur Ishiguro * @return true if entire log printed, false if overflow or error. 127d0530f420d8bdaee755ec2834af407424de195e0Arthur Ishiguro */ 128d0530f420d8bdaee755ec2834af407424de195e0Arthur Ishiguro bool logStateToBuffer(char *buffer, size_t *bufferPos, 129d0530f420d8bdaee755ec2834af407424de195e0Arthur Ishiguro size_t bufferSize) const; 130d0530f420d8bdaee755ec2834af407424de195e0Arthur Ishiguro 1311795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol private: 1321795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol /** 1338d7fbecab6b025243dcdb6dc28f49e37430dc650Andrew Rossignol * This allows tracking the state of a sensor with the various requests for it 13401d59972774453f9b0b7b92035f2919f8b6a5b35Meng-hsuan Chung * and can trigger a change in mode/rate/latency when required. 1351795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol */ 1361795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol struct SensorRequests { 13753cec69ff23e5ffabf9f29d824c14fbdb18dc856Brian Duddie //! The sensor associated with this request multiplexer. If this Optional 13853cec69ff23e5ffabf9f29d824c14fbdb18dc856Brian Duddie //! container does not have a value, then the platform does not support this 13953cec69ff23e5ffabf9f29d824c14fbdb18dc856Brian Duddie //! type of sensor. 14053cec69ff23e5ffabf9f29d824c14fbdb18dc856Brian Duddie Optional<Sensor> sensor; 1411795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol 1421795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol //! The request multiplexer for this sensor. 1438d7fbecab6b025243dcdb6dc28f49e37430dc650Andrew Rossignol RequestMultiplexer<SensorRequest> multiplexer; 1442d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol 1452d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol /** 1462d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol * Searches through the list of sensor requests for a request owned by the 1472d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol * given nanoapp. The provided non-null index pointer is populated with the 1482d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol * index of the request if it is found. 1492d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol * 1502d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol * @param nanoapp The nanoapp whose request is being searched for. 1512d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol * @param index A non-null pointer to an index that is populated if a request 1522d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol * for this nanoapp is found. 1532d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol * @return A pointer to a SensorRequest that is owned by the provided nanoapp 1542d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol * if one is found otherwise nullptr. 1552d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol */ 1562d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol const SensorRequest *find(const Nanoapp *nanoapp, size_t *index) const; 1572d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol 1582d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol /** 1592d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol * Adds a new sensor request to the request multiplexer for this sensor. 1602d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol * 1612d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol * @param request The request to add to the multiplexer. 1622d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol * @param requestChanged A non-null pointer to a bool to indicate that the 1632d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol * net request made to the sensor has changed. This boolean is always 1642d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol * assigned to the status of the request changing (true or false). 1652d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol * @return true if the add operation was successful. 1662d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol */ 1672d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol bool add(const SensorRequest& request, bool *requestChanged); 1682d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol 1692d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol /** 1702d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol * Removes a sensor request from the request multiplexer for this sensor. 1712d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol * The provided index must fall in the range of the sensor requests managed 1722d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol * by the multiplexer. 1732d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol * 1742d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol * @param removeIndex The index to remove the request from. 1752d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol * @param requestChanged A non-null pointer to a bool to indicate that the 1762d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol * net request made to the sensor has changed. This boolean is always 1772d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol * assigned to the status of the request changing (true or false). 1782d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol * @return true if the remove operation was successful. 1792d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol */ 1802d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol bool remove(size_t removeIndex, bool *requestChanged); 1812d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol 1822d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol /** 1832d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol * Updates a sensor request in the request multiplexer for this sensor. The 1842d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol * provided index must fall in range of the sensor requests managed by the 1852d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol * multiplexer. 1862d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol * 1872d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol * @param updateIndex The index to update the request at. 1882d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol * @param request The new sensor request to replace the existing request 1892d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol * with. 1902d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol * @return true if the update operation was successful. 1912d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol */ 1922d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol bool update(size_t updateIndex, const SensorRequest& request, 1932d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol bool *requestChanged); 194cea64a899fafc0e75dc0e63dbe699ca5679564adMeng-hsuan Chung 195cea64a899fafc0e75dc0e63dbe699ca5679564adMeng-hsuan Chung /** 196cea64a899fafc0e75dc0e63dbe699ca5679564adMeng-hsuan Chung * Removes all requests and consolidates all the maximal request changes 197cea64a899fafc0e75dc0e63dbe699ca5679564adMeng-hsuan Chung * into one sensor configuration update. 198cea64a899fafc0e75dc0e63dbe699ca5679564adMeng-hsuan Chung * 199cea64a899fafc0e75dc0e63dbe699ca5679564adMeng-hsuan Chung * @return true if all the requests have been removed and sensor 200cea64a899fafc0e75dc0e63dbe699ca5679564adMeng-hsuan Chung * configuration successfully updated. 201cea64a899fafc0e75dc0e63dbe699ca5679564adMeng-hsuan Chung */ 202cea64a899fafc0e75dc0e63dbe699ca5679564adMeng-hsuan Chung bool removeAll(); 2031795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol }; 2041795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol 2051795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol //! The list of sensor requests 2061795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol FixedSizeVector<SensorRequests, getSensorTypeCount()> mSensorRequests; 2071795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol}; 2081795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol 2091795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol} // namespace chre 2101795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol 2111795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol#endif // CHRE_CORE_SENSOR_REQUEST_MANAGER_H_ 212