/* * Copyright 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef SURROUND_VIEW_SERVICE_IMPL_VHALHANDLER_H_ #define SURROUND_VIEW_SERVICE_IMPL_VHALHANDLER_H_ #include #include #include #include using android::sp; namespace android { namespace hardware { namespace automotive { namespace sv { namespace V1_0 { namespace implementation { // Vhal handler cache vhal properties needed and updates them at a fixed rate. class VhalHandler { public: // Enumeration for the method to use for updating the VHAL properties, enum UpdateMethod { // Makes a periodic get call in a polling thread. // Use when VHAL implementation does not support multiple clients in subscribe calls. GET = 0, // Subscribes to the VHAL properties, to receive values periodically in a callback. // Use when VHAL implementation support multiple clients in subscribe calls. // NOTE: Currently not implemented. SUBSCRIBE }; // Empty vhal handler constructor. VhalHandler() : mIsInitialized(false), mUpdateMethod(GET), mRate(0), mIsUpdateActive(false) {} // Initializes the VHAL handler. // Valid range of rate is [1, 100] Hz. // For subscribe the rate must be within each properties min and maximum sampling rate. // For get, higher rate may result in excessive binder calls and increased latency. bool initialize(UpdateMethod updateMethod, int rate); // List of VHAL properties to read, can include vendor specific VHAL properties. // The updated method determines if properties are updated using get or subscribe calls. bool setPropertiesToRead(const std::vector& propertiesToRead); // Convenience function to set vhal properties in a format returned from IO Module. // uint64_t = (32 bits vhal property id) | (32 bits area id). bool setPropertiesToRead(const std::vector& propertiesToRead); // Starts updating the VHAL properties with the specified rate. bool startPropertiesUpdate(); // Gets the last updated VHAL property values. // property_values is empty if startPropertiesUpdate() has not been called. bool getPropertyValues(std::vector* property_values); // Stops updating the VHAL properties. // For Get method, waits for the polling thread to exit. bool stopPropertiesUpdate(); private: // Thread function to poll properties. void pollProperties(); // Pointer to VHAL service. sp mVhalServicePtr; // Mutex for locking VHAL properties data. std::mutex mAccessLock; // Initialized parameters. bool mIsInitialized; UpdateMethod mUpdateMethod; int mRate; bool mIsUpdateActive; // GET method related data members. std::thread mPollingThread; std::mutex mPollThreadSleepMutex; std::condition_variable mPollThreadCondition; bool mPollStopSleeping; // List of properties to read. std::vector mPropertiesToRead; // Updated list of property values. std::vector mPropertyValues; }; } // namespace implementation } // namespace V1_0 } // namespace sv } // namespace automotive } // namespace hardware } // namespace android #endif // SURROUND_VIEW_SERVICE_IMPL_VHALHANDLER_H_