/* Copyright (c) 2018-2020 The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of The Linux Foundation, nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef LOCATIONAPISERVICE_H #define LOCATIONAPISERVICE_H #include #include #include #include #include #include #ifdef POWERMANAGER_ENABLED #include #endif #include #include #include #include #ifdef NO_UNORDERED_SET_OR_MAP #include #else #include #endif #undef LOG_TAG #define LOG_TAG "LocSvc_HalDaemon" typedef struct { uint32_t autoStartGnss; uint32_t gnssSessionTbfMs; uint32_t deleteAllBeforeAutoStart; uint32_t posEngineMask; uint32_t positionMode; } configParamToRead; /****************************************************************************** LocationApiService ******************************************************************************/ typedef struct { // this stores the client name and the command type that client requests // the info will be used to send back command response std::string clientName; ELocMsgID configMsgId; } ConfigReqClientData; // periodic timer to perform maintenance work, e.g.: resource cleanup // for location hal daemon typedef std::unordered_map> ClientNameIpcSenderMap; class MaintTimer : public LocTimer { public: MaintTimer(LocationApiService* locationApiService) : mLocationApiService(locationApiService) { }; ~MaintTimer() = default; public: void timeOutCallback() override; private: LocationApiService* mLocationApiService; }; class SingleTerrestrialFixTimer : public LocTimer { public: SingleTerrestrialFixTimer(LocationApiService* locationApiService, std::string& clientName) : mLocationApiService(locationApiService), mClientName(clientName) { } ~SingleTerrestrialFixTimer() { } public: void timeOutCallback() override; private: LocationApiService* mLocationApiService; const std::string mClientName; }; // This keeps track of the client that requests single fix terrestrial position // and the timer that will fire when the timeout value has reached typedef std::unordered_map SingleTerrestrialFixClientMap; class LocationApiService { public: // singleton instance LocationApiService(const LocationApiService&) = delete; LocationApiService& operator = (const LocationApiService&) = delete; static LocationApiService* getInstance( const configParamToRead & configParamRead) { if (nullptr == mInstance) { mInstance = new LocationApiService(configParamRead); } return mInstance; } static void destroy() { if (nullptr != mInstance) { delete mInstance; mInstance = nullptr; } } // APIs can be invoked by IPC void processClientMsg(const char* data, uint32_t length); // from IPC receiver void onListenerReady(bool externalApIpc); #ifdef POWERMANAGER_ENABLED void onPowerEvent(PowerStateType powerState); #endif // other APIs void deleteClientbyName(const std::string name); // protobuf conversion util class LocationApiPbMsgConv mPbufMsgConv; static std::mutex mMutex; // Utility routine used by maintenance timer void performMaintenance(); // Utility routine used by gtp fix timeout timer void gtpFixRequestTimeout(const std::string& clientName); inline const MsgTask& getMsgTask() const {return mMsgTask;}; private: // APIs can be invoked to process client's IPC messgage void newClient(LocAPIClientRegisterReqMsg*); void deleteClient(LocAPIClientDeregisterReqMsg*); void startTracking(LocAPIStartTrackingReqMsg*); void stopTracking(LocAPIStopTrackingReqMsg*); void suspendAllTrackingSessions(); void resumeAllTrackingSessions(); void updateSubscription(LocAPIUpdateCallbacksReqMsg*); void updateTrackingOptions(LocAPIUpdateTrackingOptionsReqMsg*); void updateNetworkAvailability(bool availability); void getGnssEnergyConsumed(const char* clientSocketName); void getSingleTerrestrialPos(LocAPIGetSingleTerrestrialPosReqMsg*); void startBatching(LocAPIStartBatchingReqMsg*); void stopBatching(LocAPIStopBatchingReqMsg*); void updateBatchingOptions(LocAPIUpdateBatchingOptionsReqMsg*); void addGeofences(LocAPIAddGeofencesReqMsg*); void removeGeofences(LocAPIRemoveGeofencesReqMsg*); void modifyGeofences(LocAPIModifyGeofencesReqMsg*); void pauseGeofences(LocAPIPauseGeofencesReqMsg*); void resumeGeofences(LocAPIResumeGeofencesReqMsg*); void pingTest(LocAPIPingTestReqMsg*); inline uint32_t gnssUpdateConfig(const GnssConfig& config) { uint32_t* sessionIds = mLocationControlApi->gnssUpdateConfig(config); // in our usage, we only configure one setting at a time, // so we have only one sessionId uint32_t sessionId = 0; if (sessionIds) { sessionId = *sessionIds; delete [] sessionIds; } return sessionId; } // Location control API callback void onControlResponseCallback(LocationError err, uint32_t id); void onControlCollectiveResponseCallback(size_t count, LocationError *errs, uint32_t *ids); void onGnssConfigCallback(uint32_t sessionId, const GnssConfig& config); void onGnssEnergyConsumedCb(uint64_t totalEnergyConsumedSinceFirstBoot); // Callbacks for location api used service GTP WWAN fix request void onCapabilitiesCallback(LocationCapabilitiesMask mask); void onResponseCb(LocationError err, uint32_t id); void onCollectiveResponseCallback(size_t count, LocationError *errs, uint32_t *ids); void onGtpWwanTrackingCallback(Location location); // Location configuration API requests void configConstrainedTunc( const LocConfigConstrainedTuncReqMsg* pMsg); void configPositionAssistedClockEstimator( const LocConfigPositionAssistedClockEstimatorReqMsg* pMsg); void configConstellations( const LocConfigSvConstellationReqMsg* pMsg); void configConstellationSecondaryBand( const LocConfigConstellationSecondaryBandReqMsg* pMsg); void configAidingDataDeletion( LocConfigAidingDataDeletionReqMsg* pMsg); void configLeverArm(const LocConfigLeverArmReqMsg* pMsg); void configRobustLocation(const LocConfigRobustLocationReqMsg* pMsg); void configMinGpsWeek(const LocConfigMinGpsWeekReqMsg* pMsg); void configDeadReckoningEngineParams(const LocConfigDrEngineParamsReqMsg* pMsg); void configMinSvElevation(const LocConfigMinSvElevationReqMsg* pMsg); void configEngineRunState(const LocConfigEngineRunStateReqMsg* pMsg); void configUserConsentTerrestrialPositioning( LocConfigUserConsentTerrestrialPositioningReqMsg* pMsg); // Location configuration API get/read requests void getGnssConfig(const LocAPIMsgHeader* pReqMsg, GnssConfigFlagsBits configFlag); void getConstellationSecondaryBandConfig( const LocConfigGetConstellationSecondaryBandConfigReqMsg* pReqMsg); // Location configuration API util routines void addConfigRequestToMap(uint32_t sessionId, const LocAPIMsgHeader* pMsg); LocationApiService(const configParamToRead & configParamRead); virtual ~LocationApiService(); // private utilities inline LocHalDaemonClientHandler* getClient(const std::string& clientname) { // find client from property db auto client = mClients.find(clientname); if (client == std::end(mClients)) { LOC_LOGe("Failed to find client %s", clientname.c_str()); return nullptr; } return client->second; } inline LocHalDaemonClientHandler* getClient(const char* socketName) { std::string clientname(socketName); return getClient(clientname); } GnssInterface* getGnssInterface(); #ifdef POWERMANAGER_ENABLED // power event observer PowerEvtHandler* mPowerEventObserver; #endif // singleton instance static LocationApiService *mInstance; // IPC interface LocIpc mIpc; unique_ptr mBlockingRecver; // Client propery database std::unordered_map mClients; std::unordered_map mConfigReqs; // Location Control API interface uint32_t mLocationControlId; LocationControlCallbacks mControlCallabcks; LocationControlAPI *mLocationControlApi; // Configration const uint32_t mAutoStartGnss; GnssSuplMode mPositionMode; PowerStateType mPowerState; // maintenance timer MaintTimer mMaintTimer; // msg task used by timers const MsgTask mMsgTask; // Terrestrial service related APIs // Location api interface for single short wwan fix LocationAPI* mGtpWwanSsLocationApi; LocationCallbacks mGtpWwanSsLocationApiCallbacks; trackingCallback mGtpWwanPosCallback; // -1: not set, 0: user not opt-in, 1: user opt in int mOptInTerrestrialService; SingleTerrestrialFixClientMap mTerrestrialFixReqs; }; #endif //LOCATIONAPISERVICE_H